【发布时间】:2012-01-19 14:22:39
【问题描述】:
我正在使用 Netty 设计一个用于客户端/服务器通信的二进制协议,发送的字节数不是固定的,可以是任意大小。
客户端发送如下内容:
前4个字节代表一个id号 剩下的字节是一个字符串
在我看到的示例中,消息的大小是固定的,但字符串内容可以是任意大小,并且需要确保它在被服务器接收时没有碎片。我将如何在 Netty 中实现这一点?
提前致谢。
【问题讨论】:
我正在使用 Netty 设计一个用于客户端/服务器通信的二进制协议,发送的字节数不是固定的,可以是任意大小。
客户端发送如下内容:
前4个字节代表一个id号 剩下的字节是一个字符串
在我看到的示例中,消息的大小是固定的,但字符串内容可以是任意大小,并且需要确保它在被服务器接收时没有碎片。我将如何在 Netty 中实现这一点?
提前致谢。
【问题讨论】:
您如何确定消息的结尾?零?我会查看 Netty 重放解码器:
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/codec/replay/ReplayingDecoder.html
它使您的事情变得容易。继续阅读,直到找到零。如果在达到零之前用完字节,则会抛出异常以退出解码方法。当有更多字节可用时,将再次调用 decode 方法,并将现有字节和新字节组合在一个 ChannelBuffer 中。
这个循环可以重复,直到你在 ChannelBuffer 中有整个消息......然后你可以传递到下一层进行处理。
如果可以更改您的协议,我会添加一个长度,因为能够读取长度比检查每个字节是否为零更有效。
【讨论】:
或者,如果它基于行,您可以只使用 DelimiterBasedFrameDecoder 来完成这项工作。
见: http://netty.io/docs/stable/api/org/jboss/netty/handler/codec/frame/DelimiterBasedFrameDecoder.html
【讨论】: