【问题标题】:Netty - Second packet is ignoredNetty - 第二个数据包被忽略
【发布时间】:2014-11-30 17:41:22
【问题描述】:

如果我立即发送两个数据包,第二个数据包通常会被客户端忽略。在某些情况下它会捡起它,但通常就像它从未被发送一样。我已经完成了所有的调试,似乎服务器肯定在发送它,但客户端从来没有任何线索。

我正在使用 ByteBuf,它是 Netty 4 中 ChannelBuffer 的新版本。

这是我通过网络发送信息的方式:

getChannel().writeAndFlush(buffer.retain());

现在奇怪的是,如果我将这些一起发送,则不会有任何混淆。原始数据包的数据都应该是这样的,没有问题。

第二个数据包根本没有通过。

所以,例如。

ByteBuf bufferA = Unpooled.buffer();
ByteBuf bufferB = Unpooled.buffer();
bufferA.writeInt(1);
bufferB.writeInt(2);
send(bufferA);
send(bufferB);

客户端只会读取bufferA,而完全忽略bufferB,甚至不会注册它的一个字节。

如果我使用 Thread.sleep 将它们分开,客户端会很好地加载它们。

不知道该怎么办?

Server 和 Client 都在使用 netty。

编辑:我目前正在使用“作弊”修复程序,该修复程序为这种情况运行预定的执行程序(我需要一个接一个地发送两个数据包),但这根本不能解决手头的问题。

【问题讨论】:

    标签: java sockets networking netty nio


    【解决方案1】:

    也许您尝试发送相同的缓冲区两次?在这种情况下,您需要先对其调用 duplicate(),否则它将共享相同的 readerIndex 和 writerIndex,这将在将 ByteBuf 写入底层套接字时进行调整。

    【讨论】:

    • 不幸的是,情况并非如此:[OGSERVER]: Debug 1 [OGSERVER]: Packet with an id of 0 was constructed. [OGSERVER]: The packet was 16 bytes long. [OGSERVER]: The packet type was TCP [OGSERVER]: ============================================================ [OGSERVER]: Debug 2 [OGSERVER]: Packet with an id of 1 was constructed. [OGSERVER]: The packet was 8 bytes long. [OGSERVER]: The packet type was TCP [OGSERVER]: ============================================================ 显示正在发送的不同缓冲区。
    • 然而,客户端只打印这个:[TCP]Packet opcode with id of 0 was received. Length: 16 这表明它只承认第一个缓冲区?如果缓冲区被发送两次,它会这样说。
    • 没有更多细节很难说。你能分享你的完整代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多