java - Netty - 第二个数据包被忽略

标签 java sockets networking netty nio

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

我使用的是 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 将它们间隔开,客户端可以很好地加载它们。

不知道该怎么办?

服务器和客户端都使用netty。

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

最佳答案

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

关于java - Netty - 第二个数据包被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216181/

相关文章:

Java 8 - 使用许多过滤器的过滤器集合

c - 绑定(bind)到特定地址但随机端口 Linux

python - ZeroMQ 连接阻塞

macos - -bash : rvictl: command not found, Mac book pro OS X 10.7.5和Xcode 4.6

windows - 从 Windows 上的 Go *net.UDPConn 获取 syscall.Handle?

c++ - getpeername() 不适用于与本地主机的连接

java - 使用hadoop jar时如何增加堆大小?

java - 重载中的数字类型

java - 如何采取第二个 Action 来移动棋子?

sockets - (recv() == 0) 表示断开连接或超时? (套接字、Linux 和 Windows)