Java Netty-客户争夺数据?

Java Netty-客户争夺数据?,java,networking,netty,Java,Networking,Netty,因此,我需要在我的应用程序中测试一个特性,它要求我打开两个客户端,这两个客户端都通过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] 但是,当通过网络发送信息并打开多个客户端时,客户端会争夺数据,下面是一个示例: 服务器发送信息: 所有这些数据都写入ByteBuf,然

因此,我需要在我的应用程序中测试一个特性,它要求我打开两个客户端,这两个客户端都通过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]

但是,当通过网络发送信息并打开多个客户端时,客户端会争夺数据,下面是一个示例:

服务器发送信息:

所有这些数据都写入ByteBuf,然后作为字节[]通过网络发送

此数据包仅发送到客户端B,其中包含有关客户端A的信息,但是客户端A和客户端B都攻击网络以检索此数据

上面发送的所有数据都应该由客户端b按照准确的顺序读取,但结果如下

客户一读:

客户二读:

正如您所看到的,在这两种情况下,客户机甚至都没有完成读取,因为由于两个客户机都试图从中读取数据流,因此数据流已耗尽

发送数据时:

getChannel().writeAndFlush(buffer.retain());
所有这些数据都存储在ByteBuffNetty 4或ChannelBufferNetty 3中


调试显示我们只发送到客户端2,但两个客户端仍然尝试读取它,我如何防止这种情况

你的描述让我有点困惑。你说你需要开两个客户。我假设您的意思是,您有两个客户机套接字打开,由Netty控制,与运行在独立于Netty客户机应用程序的进程空间中的某个服务器通信?我通过通道发送所有数据,通道似乎不同。你指的是哪个频道?因此,一般来说,如果客户端到服务器上有两个不同的Netty通道,它们应该具有与两个套接字相同的独立性。应用程序如何为每个通道配置管道,以及如何读取数据?您是否尝试过仅从服务器发送到一个通道,或禁用其中一个客户端的连接?@ScottMitchell-客户端的管道使用MessageToMessageEncoder的标准实现与ByteToMessageDecoder相结合,尽管打印堆栈跟踪,但通道处理程序几乎是空的。我通过通道发送所有数据的意思是,当客户端连接并通过用户/通行证授权其连接时,我存储客户端的通道,以备将来在服务器上参考。服务器根据数据来自的帐户引用此通道,方法是获取通过deco的相对于ChannelHandlerContext的通道。。。。。。ByteToMessageDecoder中的decode函数,然后通过HashMap进行过滤,以找到与此通道相关的帐户,这始终可以正常工作,没有任何缺陷。例如:客户端A[Tom]发送一条消息,服务器意识到它是Tom,等等-但是当向这个通道发送数据时,两个客户端都试图争夺数据,不管我将数据写入哪个通道,每个客户端都是它自己的应用程序实例。我可能应该补充一点,如果我将三个或四个客户端连接到服务器,然后他们都会争夺数据,我知道这不是我发送的通道的问题,因为我使用OIO套接字创建了一个小应用程序,它工作得很好。-每个客户端都是它自己的应用程序实例。
[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());