라이브러리로 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 이고
인터페이스 상속과 클래스 상속을 이용하여 하나의 클래스를 이용해서 인코딩과 디코딩을 구현한 클래스다.
데이터를 디코딩하거나 인코딩하는 핸들러 클래스는 하나만 등록되어야하며 두개이상의 클래스가 등록되었다면
오류를 내뱉거나 하나의 클래스에서만 동작할 수 있으니 유의가 필요하다. 그러니 항상 이곳을 이용할때는 유의해서
사용하는것이 중요하다.
'netty' 카테고리의 다른 글
자바내장 소켓통신 (0) | 2021.06.09 |
---|---|
JAVA pom.xml 오류 해결 (0) | 2021.05.24 |
netty spring start (0) | 2021.05.17 |
NETTY DECODER (0) | 2021.05.12 |
정보처리기사 시험 팁 (0) | 2021.05.11 |
댓글