Netty MessageToByteEncoder与通过Unpooled.wrappedBuffer直接推送

时间:2014-05-26 08:47:50

标签: java network-programming netty nio

我有一个C ++客户端使用TCP连接到我的Java netty服务器,当我尝试将消息长度预先挂起到消息并发送到C ++客户端时,我遇到了这个问题:

我扩展了MessageToByteEncoder并将其编码如下

int length = msg.getLength();    
byte[] data = msg.getData();
short littleEndianLength = ByteBufUtil.swapShort(length);
out.writeShort(littleEndianLength);
out.writeBytes(data, 0, length);

然后使用此方法(在处理程序中)发送消息

channel.writeAndFlush(msg).addListener(sendListener);

但是,客户端没有收到消息。

我改为替代方式,我直接创建二进制消息并发送如下:

byte[] buf = new byte[msgLength + 2];
// Convert message length to little-endian byte order
buf[0] = (byte) (msgLength & 0xFF);
buf[1] = (byte) ((msgLength >> 8) & 0xFF);

System.arraycopy(data, 0, buf, 2, msgLength);
ByteBuf byteBuf = Unpooled.wrappedBuffer(buf);
channel.writeAndFlush(byteBuf).addListener(sendListener);

客户收到邮件。

有人可以帮我解释一下吗?

1 个答案:

答案 0 :(得分:0)

当您使用MessageToByteEncoder并且您的编码器需要某种类型的消息时,从代码中看起来似乎不是ByteBuf,您必须改为编写该类型的消息一个ByteBuf。否则,MessageToByteEncoder将无法处理ByteBuf并将其传递给管道中的下一个处理程序。

因此,您应该执行以下操作,而不是编写byteBuf

channel.writeAndFlush(msg).addListener(sendListener);