插座。当我需要时,数据包会保持排队

时间:2012-03-22 07:50:10

标签: java sockets air netty

我从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抱歉英语不好-_-

2 个答案:

答案 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()