我从socket接收数据时遇到了奇怪的问题。 在客户端我使用空气插座。在服务器上的java netty。 我写入socket简单数据包:int numPacket,int textLength,utf8String text。并在客户端阅读。
//server
buffer.writeInt( packetId );
ChannelBuffer ch = ChannelBuffers.copiedBuffer( text, CharsetUtil.UTF_8);
buffer.writeInt( text.length() );
buffer.writeBytes(ch);
//client
packetId = socket.readInt()
packetLen = socket.readInt()
text = socket.readUtfBytes(packetLen)
有时一个数据包()不会被客户端接收,但服务器被发送到那里,而tcpdump显示数据包已发送。如果服务器发送新数据包,客户端读取前一个数据包,并且不接收新数据包 - 它就像我不需要的队列一样工作。 p.s抱歉英语不好-_-
答案 0 :(得分:1)
看起来客户端可能正在等待某个字节\n
,\u
等以了解帧结束。我有类似的问题,因为客户端在传输结束时期待null byte
。
您可以尝试添加以下类型的encoder作为管道中的最后一个编码器并尝试一下。处理nul字节的相关代码如下所示。
ChannelBuffer nulBuffer = ChannelBuffers.wrappedBuffer(new byte[] { 0 });
ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg,nulBuffer);
答案 1 :(得分:0)
在每个或所有三个
之后尝试在缓冲区上使用flush()