netty client 예제

소켓 전송의 메시지 유형이 항상 ChannelBuffer라고 가정하는 것이 안전합니다. ChannelBuffer는 Netty에 바이트 시퀀스를 저장하는 기본 데이터 구조입니다. NIO 바이트버퍼와 비슷하지만 사용하기 쉽고 유연합니다. 예를 들어 Netty를 사용하면 여러 채널버퍼를 결합하여 불필요한 메모리 복사본 수를 줄이는 복합 채널버퍼를 만들 수 있습니다. 즉, 모든 작업은 호출 직후에 반환됩니다. 표준 Java 라이브러리에는 Future 인터페이스가 있지만 Netty 의 목적에는 편리하지 않습니다 . ChannelHandlers에서 POJO를 사용하는 이점은 분명합니다. ByteBuf에서 정보를 추출하는 코드를 처리기에서 분리하여 처리기를 보다 유지 관리 가능하고 재사용 이 수성하게 됩니다. TIME 클라이언트 및 서버 예제에서는 32비트 정수만 읽으며 ByteBuf를 직접 사용하는 것은 큰 문제가 아닙니다. 그러나 실제 프로토콜을 구현할 때 분리를 수행해야 합니다. 서버의 또 다른 클래스는 주 클래스 NettyServer.java입니다.

지금까지 검토한 모든 예제에서는 ByteBuf를 프로토콜 메시지의 기본 데이터 구조로 사용했습니다. 이 섹션에서는 ByteBuf 대신 POJO를 사용하도록 TIME 프로토콜 클라이언트 및 서버 예제를 개선합니다. 부트 스트랩, 채널 퓨처, 채널 초기 화자, 채널 파이프 라인 파이프 라인, 에코 클라이언트, 에코 클라이언트 핸들러, 이벤트 루프 그룹, 예외, 호스트, nioeventloopgroup, 포트, ssl, sslcontext, 문자열이 예제에는 1 개의 서버와 1 개의 클라이언트가 있습니다. 긴 연결은 데이터 전송에 사용됩니다. 5초마다 데이터 사이에 데이터가 없는 경우 하트 비트 메시지가 서버에서 클라이언트로 전송됩니다. 하트 비트 메시지에는 보내는 시간의 타임스탬프가 있습니다. 클라이언트는 하트 비트를 얻을 때 아무것도하지 않지만 단순히 서버에 다시 보낼 수 있습니다. 서버는 recv 시간 빼기 시간을 전송하여 사용하여 루프백 지연을 인쇄할 수 있습니다.

TimeClient에 위의 세 단계를 적용하려면 TimeClient.main()은 하나의 클라이언트 연결을 닫고 ChannelFactory에서 사용하는 모든 리소스를 해제하여 전역을 정상적으로 종료할 수 있습니다. Netty는 비차단 프레임워크입니다. 이로 인해 IO 차단에 비해 처리량이 높습니다. 차단되지 않는 IO를 이해하는 것은 Netty의 핵심 구성 요소와 그 관계를 이해하는 데 매우 중요합니다. 클라이언트를 종료하는 것은 매우 쉬웠지만 서버를 종료하는 것은 어떨까요? 포트에서 바인딩을 해제하고 열려 있는 모든 열려 있는 연결을 닫아야 합니다. 이렇게 하려면 활성 연결 목록을 추적하는 데이터 구조가 필요하며 간단한 작업이 아닙니다. 다행히도, 솔루션, 채널 그룹이있다. 이 장에서 예제를 실행하기 위한 최소 요구 사항은 두 가지뿐입니다. Netty 및 JDK 1.6 이상의 최신 버전입니다.