所以,我需要测试我的应用程序中的一个功能,它要求我打开两个客户端,这两个客户端都是通过localhost连接的。我通过频道发送所有数据,似乎频道不同。
客户一:[id: 0xd7f05dd1, /127.0.0.1:56571 => /127.0.0.1:5055]
客户二:[id: 0xeb0a36e7, /127.0.0.1:56606 => /127.0.0.1:5055]
但是,当通过网络发送信息并打开多个客户端时,客户端会竞争数据,这是一个例子:
服务器发送信息:
[DEBUG::Packet_02_RegisterRemotePlayer]: Wrote ID: 97271
[DEBUG::Packet_02_RegisterRemotePlayer]: Wrote X: 6.54161
[DEBUG::Packet_02_RegisterRemotePlayer]: Wrote Y: -8.271806
[DEBUG::Packet_02_RegisterRemotePlayer]: Wrote Z: 1.8378098
[DEBUG::Packet_02_RegisterRemotePlayer]: Wrote ROT: 0.0
[DEBUG::Packet_02_RegisterRemotePlayer]: Wrote PRIV: 0
[DEBUG::PacketBuffer]: Packet with an id of 2 was constructed.
[DEBUG::PacketBuffer]: The packet was 28 bytes long.
[DEBUG::PacketBuffer]: The packet type was TCP
所有这些数据都写入ByteBuf,然后通过网络作为字节发送[]
此数据包仅发送到客户端B,其中包含有关客户端A的信息,但客户端A和客户端B都攻击网络以检索此数据。
上面发送的所有数据都应该由客户端b读取(按照确切的顺序),但这是结果。
客户一读:
[2]Read ID: -1056679599
[2]Read X: 1.8378098
[2]Read Y: 0.0
[2]Read Z: 0.0
客户二阅读:
[2]Read ID: 1087460574
[2]Read X: -8.271806
[2]Read Y: 1.8378098
[2]Read Z: 0.0
[2]Read ROT: 0.0
正如您所看到的,客户端甚至没有完成它在任何一种情况下的读取,因为流是饥饿的,因为两个客户端都试图从中读取它。
发送数据时:
getChannel().writeAndFlush(buffer.retain());
所有这些数据都存储在ByteBuf
(Netty 4)AKA ChannelBuffer
(Netty 3)中
调试显示我们只发送到客户端二,但两个客户端仍然尝试读取它,我该如何防止这种情况?