본문 바로가기
Programming/TCP IP

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

by Pendine 2021. 5. 11.
728x90

스스로에게 하는 설명은 여기까지하고 좀 더 자세하게 소스코드를 적자면 이렇게 할 수 있다.

 

Netty에서는 소켓통신을 이용하기 때문에 아이피뿐만이 아니라 접속할 포트번호까지도 필요하다.

웹 주소의 아이피도 자바에서 지원하는

URI 클래스를 이용해서 획득할 수 있고,

http인지 https 인지 에 따라서 포트번호도 이미 정의가 되어있으니 80, 443 으로 파악할 수 있다.

 

 

클라이언트에서는

 

Bootstrap clientBootstrap = null;

clientBootstrap = new Bootstrap();

EventLoopGroup e = new NioEventLoopGroup(Integer.valueOf(workerThread));

clientBootstrap.group(e)
               .option(ChannelOption.AUTO_READ, true)
               .handler(new ChannelInitializer());
               
clientBootstrap.connect( IP, Port); // <- 연결부분
//or clientBootstrap.connect( new InetSocketAddress(this.host, this.port) ); 

 

으로 연결 할 수 있다.

 

위에서 보이는것 같이 부트스트랩을 생성하면서 하나의 부트스트랩에 하나의 이벤트 처리 스레드를 설정해준다.

채널의 인코더, 디코더 설정은 아래와 같이 했다.

 

@Override
    protected void initChannel(Channel channel) throws Exception {
        ChannelPipeline pipeline = channel.pipeline();

        pipeline.addLast("Decoder", new Decoder());
        pipeline.addLast("Encoder", new Encoder());

    }

위에서의 디코더 클래스와 인코더 클래스는 각각 인바운드 핸들러와 아웃바운드 핸들러를 상속받은 클래스이며

각각의 핸들러에서는 encode() 와 decode() 메소드를 구현하여 메시지가 들어왔을때 수신된 메시지를 처리하게끔 동작시켜놨다.

 

 

개인적인 생각으로 디코딩 부분에서의 핵심적으로 살펴봐야하는 클래스는 byteBuf클래스라고 생각한다.

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> out) throws Exception {
        ...
        
        out.add(data);
    }

아주 간단하게 다룰 수 있는 클래스라고 생각하지만 이 클래스 덕분에 채널있는 데이터를 읽기가 매우 수월해진다.

완벽하게 살펴보지 않아 명확하게 단언할 수 없지만

자체적인 인덱스가 있는지

get(), getShort() 등의 메소드를 이용하여 원하는 만큼만 읽을 수 있고,

BufferByteOrder, ByteBuffer 클래스와 조합하여 엔디안을 적용하여, 각 엔디안 방식을 적용한 바이트을 생성, 읽을 수 있다.

 

 

다음은 이해하기가 어려워 그냥 암기를 해낸부분으로 위의 디코딩한 부분에서 List<Object> out 에 추가해준 data 가 어디에서 사용되는지.

 

인터페이스 클래스인 ChannelInboundHandler 를 상속받은 클래스는 channelRead() 라는 메소드를 상속받는다.

 

이 channelRead() 메소드에서 인자값은 ChannelHandlerContext ctx, Object msg 으로 정의되어있는데

데이터가 들어오면 decode()메소드를 거쳐 channelRead() 메소드를 동작시키는것 같다.

 

최종적으로 현재 channelRead()메소드에서 받은 데이터를 처리하게끔 구현해놨다.

 

서버와 클라이언트 둘은 초기에 bootstrap에 대한 설정만 다르지 수신과 송신에 에 대한 동작은 동일하다.

 

 

================================================================

수신과정 정리

 

1. 부트스트랩 및 부트스트랩에 관련된 초기 설정 및 연결.

(핸들러 설정 및 기타 설정 설명 생략)

 

2. 수신된 데이터는 InboundHandler 를 상속받은 클래스에서 decode() 메소드를 동작.

 

3. decode()메소드를 동작시킨 뒤 나온 데이터는 channdelRead()메소드를 동작.

 

-끝-

 

 

728x90

'Programming > TCP IP' 카테고리의 다른 글

포트상태 대략정리  (1) 2021.12.21
wireshark capture 안뜸 오류  (0) 2021.08.24
[Netty/JAVA] 재접속 오류 확인  (0) 2021.07.21
자바 TCP/IP 통신 (Netty, 네티) - 3 송신  (0) 2021.05.21
자바 TCP/IP 통신 (Netty, 네티)  (0) 2021.05.11

댓글