Java 使用MessageToByteEncoder作为最后一个出站处理程序不会';我什么也不退
我的管道如下:Java 使用MessageToByteEncoder作为最后一个出站处理程序不会';我什么也不退,java,netty,Java,Netty,我的管道如下: Preprocessor -> Decoder -> Encoder -> Processor @Override protected void encode(ChannelHandlerContext ctx, CommandResponse msg, ByteBuf out) throws Exception { //Encode the response String responseString; ..... //Co
Preprocessor -> Decoder -> Encoder -> Processor
@Override
protected void encode(ChannelHandlerContext ctx, CommandResponse msg, ByteBuf out) throws Exception {
//Encode the response
String responseString;
.....
//Convert resulting string to bytes using specified charset
byte[] bytes = responseString.getBytes(charset);
//Send bytes
out.writeBytes(bytes);
}
预处理器
、解码器
和处理器
都是ChannelInboundHandlerAdapter
Encoder
是一个messagetobytecoder
当管道接收到我的请求(作为UDP数据报发送)时,预处理器将其解析为字符串
,并将字符串
传递给解码器
。解码器
解析字符串
以创建命令
对象,并将结果对象传递给处理器
。处理器
处理命令
并生成CommandResponse
对象,该对象通过调用ctx.writeAndFlush(CommandResponse)传递给编码器
代码>。Encoder
将命令编码为字节数组,然后编码为ByteBuf
,如下所示:
Preprocessor -> Decoder -> Encoder -> Processor
@Override
protected void encode(ChannelHandlerContext ctx, CommandResponse msg, ByteBuf out) throws Exception {
//Encode the response
String responseString;
.....
//Convert resulting string to bytes using specified charset
byte[] bytes = responseString.getBytes(charset);
//Send bytes
out.writeBytes(bytes);
}
但是,在发送端没有收到任何信息
我使用NioDatagramChannel
作为通道和Netty版本4.0.x
谢谢,
Mickeel我猜写调用返回的ChannelFuture失败了。看看这个。此外,在使用NioDatagramChannel时,您很可能希望将CommandResponse转换为DatagramPack。为此,请使用信息编码。感谢您的帮助,诺曼!我已经在另一个处理程序(不是编码器)中解决了这个问题,并通过编写DatagramPacket解决了这个问题。但是,我能够获取数据包的发件人并将其设置为收件人地址,但我不知道如何在encode方法中获取它。预处理器可以转发包含字符串和发件人地址的对象而不是转发字符串吗?在命令对象中包含发件人的地址,您将在需要时获得该信息。@johnstlr这真的是Netty应该使用的方式吗?Norman可能会纠正我,但使用UDP,我看您没有太多选择。AIUINetty不会为每个UDP端点创建新管道,因为只有一个套接字接收所有传入的数据包。UDP数据包包含有关远程对等方的所有信息。如果您丢弃数据报数据包,则会丢失该信息。也许直接解码到一个命令对象并在其中包含发送者的地址会更好——也就是说,将预处理器和解码器结合起来。