我在从套接字接收数据时遇到奇怪的问题。 在客户端我使用空气 socket 。在服务器上java netty。 我正在写入套接字简单数据包: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)
有时客户端没有收到一个 packet(),但服务器已发送到那里,并且 tcpdump 显示数据包已发送。如果服务器发送新数据包,客户端读取以前的数据包,并且不接收新数据包 - 它的工作方式就像我不需要的队列。 p.s抱歉英语不好-_-
最佳答案
看起来客户端可能正在等待一些字节\n
、\u
等来知道帧的结束。我对 flash 也有类似的问题,因为客户端期望在传输结束时出现一个空字节
。
您可以尝试添加以下类型的 encoder作为管道中的最后一个编码器并尝试一下。处理nul字节的相关代码如下所示。
ChannelBuffer nulBuffer = ChannelBuffers.wrappedBuffer(new byte[] { 0 });
ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg,nulBuffer);
关于java - socket 。当我需要数据包时,数据包会留在队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9818291/