java - socket 。当我需要数据包时,数据包会留在队列中

标签 java sockets air netty

我在从套接字接收数据时遇到奇怪的问题。 在客户端我使用空气 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/

相关文章:

python - 使用 websockets 和 python/django(/扭曲?)

ios - 如何在 iOS 中使用套接字连接从服务器获取响应?

java - 如何将数组从Python(客户端)发送到Java(服务器)?

ios - 无法在 iOs 9.1 Adob​​e Air 上启动应用程序(并非所有设备)

android - Adobe AIR 后退按钮事件不适用于 Android API 28+

apache-flex - 如何在 Flex 中检测多窗口 AIR 应用程序窗口外的点击?

java - Hibernate列表映射问题

java - 命令行参数

java - 如何在 JSP 中的 LinkedHashMap 中执行 foreach 循环?

java - Android Studio 自动补全