java - Netty:MessageToMessageEncoder 并转换为 ByteBuf

标签 java netty

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

我想在本地主机上创建一个简单的 SMTP 服务器用于测试目的,但我在理解编码器的工作原理时遇到了一个小问题。

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

  1. 客户端正在端口 25 连接到服务器 - 正常
  2. 服务器发送此消息:220 localhost Test\r\n
  3. 客户端收到2发送的消息并回复HELO another

我的问题出在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());

最佳答案

是的。最终,有效负载必须采用 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));

关于java - Netty:MessageToMessageEncoder 并转换为 ByteBuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44058043/

相关文章:

javascript - Spring MVC Servlet 响应对象中的确认弹出(是或否)和处理是和否事件

java - Android java 启动新 Activity 时出现问题

Java 在 VPS 上内存不足

java - Netty 中的并发

java - 获取 Google oAuth2 访问 token 时出现问题 - 重定向 Uri 不匹配

java - Netty ServerSocket 和子进程正常关闭

java - 简单的Java api来形成和发送ntp数据包

netty - 是否可以在同一个应用程序中使用 Netty 3.x 和 4.0,或者会不会有类名冲突?

java - Netty TCP 客户端异步消息

java - 类定义中的方法数量会影响实例化类时的内存消耗吗?