Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理Netty中的碎片_Java_Netty - Fatal编程技术网

Java 处理Netty中的碎片

Java 处理Netty中的碎片,java,netty,Java,Netty,我正在使用Netty为客户机/服务器通信设计一个二进制协议,发送的字节数不是固定的,可以是任意大小 客户端正在发送如下内容: 表示id号的前4个字节 剩余的字节是一个字符串 在我看到的示例中,消息的大小是固定的,但是字符串内容可以是任意大小,并且需要确保在服务器接收到消息时不会出现碎片。我将如何在Netty中实现这一点 提前感谢。您如何确定邮件的结尾?零?我会查看Netty回放解码器: 它使你的事情变得容易。继续读,直到找到零为止。如果在达到零之前用完字节,将抛出异常以退出解码方法。当更多字节

我正在使用Netty为客户机/服务器通信设计一个二进制协议,发送的字节数不是固定的,可以是任意大小

客户端正在发送如下内容:

表示id号的前4个字节 剩余的字节是一个字符串

在我看到的示例中,消息的大小是固定的,但是字符串内容可以是任意大小,并且需要确保在服务器接收到消息时不会出现碎片。我将如何在Netty中实现这一点


提前感谢。

您如何确定邮件的结尾?零?我会查看Netty回放解码器:

它使你的事情变得容易。继续读,直到找到零为止。如果在达到零之前用完字节,将抛出异常以退出解码方法。当更多字节可用时,将再次调用解码方法,将现有字节和新字节合并到一个ChannelBuffer中

这个循环可以重复,直到你有整个消息在ChannelBuffer…然后你可以传递到下一层进行处理


如果可以更改您的协议,我会添加一个长度,因为能够读取到长度比检查每个字节是否为零要有效得多。

您如何确定消息的结尾?零?我会查看Netty回放解码器:

它使你的事情变得容易。继续读,直到找到零为止。如果在达到零之前用完字节,将抛出异常以退出解码方法。当更多字节可用时,将再次调用解码方法,将现有字节和新字节合并到一个ChannelBuffer中

这个循环可以重复,直到你有整个消息在ChannelBuffer…然后你可以传递到下一层进行处理


如果可以更改您的协议,我会添加一个长度,因为能够读取到长度比检查每个字节是否为零要高效得多。

或者如果它是基于行的,您可以使用DelimiterBaseFrameDecoder来执行此任务

见:

或者,如果它是基于行的,您可以使用DelimiterBasedFrameDecoder来执行作业

见:

你好,Gareth,谢谢你的回答-非常感谢。我目前没有使用任何东西来确定消息的结尾。一旦通过调用buffer.readLong()检索到id,我就会调用buffer.toString(字符串charsetName)——这并不理想。当您提到发送有效负载的大小时,是否建议将其添加到开头并等待,直到收到长度,然后使用该任意数字来确定在服务器上等待更多字节?是的。有了长度后,您可以使用LengthFieldBasedFrameDecoder(如果您的消息可能非常大,但最好基于SimpleChannelUpstreamHandler编写自己的消息,以便只分配一次缓冲区)。您好,Gareth,感谢您的回答-非常感谢。我目前没有使用任何东西来确定消息的结尾。一旦通过调用buffer.readLong()检索到id,我就会调用buffer.toString(字符串charsetName)——这并不理想。当您提到发送有效负载的大小时,是否建议将其添加到开头并等待,直到收到长度,然后使用该任意数字来确定在服务器上等待更多字节?是的。有了长度后,您可以使用LengthFieldBasedFrameDecoder(如果您的消息可能非常大,但最好基于SimpleChannelUpstreamHandler编写自己的消息,以便只分配一次缓冲区)。谢谢!看起来我需要创建自己的帧解码器实现。谢谢!看起来我需要创建自己的帧解码器实现。