我从套接字接收数据有一个奇怪的问题。
在客户端即时通讯使用空气 socket 。在服务器Java netty上。
我正在写套接字简单的数据包:int numPacket,int textLength,utf8String文本。并在客户端上阅读。

//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中也遇到了类似的问题,因为客户端在传输结束时期待null byte

您可以尝试将以下类型的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/

10-12 22:53
查看更多