Netty:MessageToMessageEncoder并转换为ByteBuf

时间:2017-05-18 21:26:47

标签: java netty

我是Netty的新手并试图了解它是如何工作的。

我想在localhost上创建一个简单的SMTP服务器用于测试目的,并且我在理解编码器如何工作方面遇到了一个小问题。

首先,这是我想要实现的目标。

  1. 客户端正在端口25上连接到服务器 - OK
  2. 服务器发送此消息:220 localhost Test \r\n
  3. 客户收到2发送的邮件,并回复HELO whatever
  4. 我的问题出在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");无效,未返回任何错误,客户端未继续指向3发送HELO消息。

    但是,如果我将其改为此

    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 个答案:

答案 0 :(得分:2)

是。最终,有效载荷必须采用ByteBuf的形式。但是,按照预期,但未在您引用的示例中显示,MessageToMessage编码器将在下游管道中由另一个编码器跟踪,该编码器将消息转换为ByteBuf。在您的情况下,pyWin32可以解决问题,如此链接中的代码所示:

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));