我正在使用 Netty 设计用于客户端/服务器通信的二进制协议(protocol),发送的字节数不是固定数量,可以是任意大小。
客户端正在发送这样的东西:
前4个字节表示一个id号 剩下的字节是一个字符串
在我看到的例子中,消息是固定大小的,但是字符串内容可以是任意大小,并且需要确保它在被服务器接收时不会被碎片化。我如何在 Netty 中实现这一点?
提前致谢。
最佳答案
您如何确定消息的结尾?一个零?我会检查 Netty 重放解码器:
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/codec/replay/ReplayingDecoder.html
它让事情变得简单。继续阅读直到找到零。如果在到达零之前用完了字节,将抛出异常以退出解码方法。当有更多字节可用时,将再次调用 decode 方法,将现有字节和新字节组合在一个 ChannelBuffer 中。
这个循环可以重复,直到您在 ChannelBuffer 中拥有整个消息...然后您可以将其传递到下一层进行处理。
如果可以更改您的协议(protocol),我会添加一个长度,因为能够读取长度比检查每个字节是否为零更有效。
关于java - 处理 Netty 中的碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8914268/