java - 处理 Netty 中的碎片

标签 java netty

我正在使用 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/

相关文章:

java - 哪个是呈现任意 HTML 的最佳 Wicket 组件?

spring-boot - 更改在 Jetty 而不是 Netty 上运行的 Webflux 后出现异常

java - Netty上的FileInputStream是什么

java - Netty 或 java.net.Socket 用于绿地项目?

java - Android 应用程序无法看到通过 JSP 创建的数据存储实体

java - 将第二个窗口隐藏在第一个窗口后面

java - Activity 生命周期中的 onResume() 和 onPostResume() 有什么区别?

java - 如何在代码中分析 JVM 内存?

java - 在 Netty ServerSocket 中获取主线程

java - Netty ByteToMessageDecoder 运行的次数超出了它必须的次数