2012-03-22 31 views
1

从套接字接收数据有奇怪的问题。 在客户端即时通讯使用空气插座。在服务器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) 

有时一个数据包()犯规被客户端接收,但服务器在发送有和tcpdump显示,包被发送。如果服务器发送新的数据包,客户端读取先前的数据包,并且不接收新的数据包 - 它就像我不需要的队列一样工作。 P.S遗憾的英语不好-_-

回答

1

看起来像客户端也许等待一些字节\n\u等知道帧结束后,你的缓冲区。我遇到类似的问题,因为客户端在传输结束时期待null byte

您可以尝试添加以下排序encoder作为您的管道中的最后一个编码器,并试一试。处理nul字节的相关代码如下所示。

ChannelBuffer nulBuffer = ChannelBuffers.wrappedBuffer(new byte[] { 0 }); 
    ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg,nulBuffer); 
0

尝试使用冲水()上的每个或全部三个

+0

tcpdump显示数据包被正确发送。 Flush不会帮助我 – user1081056 2012-03-22 10:16:37

相关问题