2017-05-18 6 views
0

저는 Netty를 처음 사용하고 어떻게 작동하는지 이해하려고합니다.Netty : MessageToMessageEncoder 및 ByteBuf로 변환

로컬 호스트에서 테스트 용으로 간단한 SMTP 서버를 만들고 싶습니다. 인코더 작동 방식을 이해하는 데 약간의 문제가 있습니다.

첫 번째는 달성하고자하는 것입니다. 220 localhost Test \r\n

  • 클라이언트가 2에서 보낸 메시지를 수신하고 HELO whatever
  • 으로 응답 내 문제는 지점에 : 서버가이 메시지를 전송 OK

  • -

    1. 클라이언트는 25 포트에서 서버에 연결되어 2

      MessageToMessageEncoder

      @Override 
      protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception { 
          //... 
          out.add("220 localhost test \r\n"); 
      } 
      

      out.add("220 localhost Test \r\n");는 아무것도하지 않습니다 그 코드는 오류가 반환되지 않고 클라이언트가 HELO 메시지를 전송 3을 가리 키도록 진행되지 않습니다.

      그러나 나는이

      ByteBuf buff = ByteBufUtil.writeUtf8(ctx.alloc(), "220 localhost Test \r\n"); 
      out.add(buff); 
      

      모두에게 큰 실행하고 클라이언트가 HELO 메시지

      그래서 제 질문은 내가 항상 ByteBuf에 메시지를 인코딩해야 할 것입니다을 전송하고 있음을 변경하는 경우? 공식 문서 때문에 http://netty.io/4.1/api/io/netty/handler/codec/MessageToMessageEncoder.html 과 비슷한 것을 볼 수 있습니다. out.add(message.toString());

  • 답변

    1

    예. 결국 페이로드는 ByteBuf 형식이어야합니다. 그러나 인용 된 예제에서는 의도 한대로 표시되지 않지만 MessageToMessage 인코더는 메시지를 ByteBuf로 변환하는 다른 인코더에 의해 다운 스트림 파이프 라인에서 추적됩니다. 해당 링크에서이 코드와 같이 사용자의 경우, http://netty.io/4.1/api/io/netty/handler/codec/string/StringEncoder.html는 트릭을 할 것입니다 :

    ChannelPipeline pipeline = ...; 
    
    // Decoders 
    pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(80)); 
    pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8)); 
    
    // Encoder 
    pipeline.addLast("stringEncoder", new StringEncoder(CharsetUtil.UTF_8)); 
    
    +0

    그래서 메시지 위해서는 결국 전송 그것은 ByteBuf이어야 될? –