본문 바로가기
Programming/TCP IP

자바 TCP/IP 통신 (Netty, 네티)

by Pendine 2021. 5. 11.
728x90

라이브러리로 Netty를 사용함.

 

자바의 socket 클래스를 이용해서 구현도 가능하지만

 

회사에서 소켓통신에 대한 부분을 네티를 이용해서 처리하고있어

이부분을 정리해보려고한다.

 

네티에서는 소켓 통신을 이용하여 클라이언트와 서버와 연결을 유지하고

BootStrap, channel, channelContextHandler 등의 클래스들을 이용하여

통신을 한다.

 

초기 연결시 BootStrap을 이용하여 서버와 클라이언트간 연결을 시도한다.

 

다만 이때 네티에서는 클라이언트와 서버는 초기 설정시

BootStrap, 이벤트처리 스레드 설정이 다르다.

 

서버는 serverBootstrap이라는것을 사용하고 이벤트 처리 스레드도 2개를 생성하여

클라이언트에 대한 연결과 데이터처리용으로 2개를 생성하고

 

클라이언트는 Bootstrap 클래스를 사용하고 이벤트 처리 스레드도 하나로 끝난다.

 

이 부트스트랩이라는 클래스는 데이터를 송수신 할때 사용되는 통로인 channelContextHandler 라는 인터페이스 클래스를 사용한다.

 

클라이언트와 서버간의 송수신은 Bootstrap을 이용하여 연결이 수립된 뒤 부터 channelContextHandler클래스를 이용하여 데이터를 송수신 할 수 있다.

 

 

데이터를 송수신해주는 ChannelContextHandler 클래스에서는 데이터가 오가는 Channel 이라는 클래스가 포함되어 있는데, 이 채널이라는 클래스에 데이터가 들어오는 인바운드, 데이터가 나가는 아웃바운드의 설정을 해줄 수 있다.

 

설정하는 방법은 channel.channel().pipeline().addLast( "핸들러 이름" , 핸들러를 상속받은 클래스 );

라고 간단하게 할 수 있으며 pipeline인터페이스 클래스에 있는 메소드의 활용 방법에 따라서 addLast, addFirst를 이용할수도 있고, remove(핸들러 이름)등록된 핸들러를 제거 할 수 있다.

 

자세한건 netty.io/4.1/api/index.html  네티 API 페이지인 이쪽으로 이동해서 확인 할 수 있다.

 

 

데이터가 들어오는것을 decode()메소드를 이용하여 처리할 수 있는데,

디코딩하는 클래스는 InboundHandler 클래스를 상속받은 클래스에 한해서 가능하다.

 

 

데이터를 송신하는 메소드는 encode()메소드를 이용하여 처리할 수 있다.

인코딩하는 클래스는 OutboundHandler 클래스를 상속받은 클래스에 한해서 가능하다.

 

 

이 두개를 모두 상속받은 클래스가 존재하는데 이 클래스는 ChannelDuplexHandler 이고

인터페이스 상속과 클래스 상속을 이용하여 하나의 클래스를 이용해서 인코딩과 디코딩을 구현한 클래스다.

 

 

데이터를 디코딩하거나 인코딩하는 핸들러 클래스는 하나만 등록되어야하며 두개이상의 클래스가 등록되었다면

오류를 내뱉거나 하나의 클래스에서만 동작할 수 있으니 유의가 필요하다.

728x90

댓글