【发布时间】:2012-05-09 05:26:03
【问题描述】:
我有一个基于 TCP 的 Netty 应用程序,其中有多个需要相互通信的客户端。我将所有 Channel 引用存储在 ChannelGroup 中。
虽然我知道我可以通过调用 ChannelGroup.write 向 ChannelGroup 中的每个客户端写入数据,但是除了其中一个之外,还有什么是写入所有通道的有效方法,例如:
'A','B','C'在一个频道组中,'A'需要发送给'B'和'C','B'需要发送给'A'和'C'等。什么是最好的方法呢?以下是我想到的一些选项,但我们将不胜感激:
只需遍历 Group 并单独写入通道(在这种情况下不要使用 ChannelGroup.write)
反复“重新制作/克隆” ChannelGroup,使其仅包含要写入的通道。然后我会在修改后的组上调用 ChannelGroup.write,然后将组恢复到完整组。
写入所有通道,但实现一些处理程序逻辑以丢弃(在编码或下游处理程序上)并且如果消息来自排除的通道,则不写入。
就设计权衡而言,消息尽可能快地发送,ChannelGroup 相对较小,
非常感谢您的帮助!
【问题讨论】:
-
我可能会按照选项 3 的方式做一些事情。如果您真的不希望通道向自己写入数据,那么在通道(或处理程序?)中包含逻辑是有意义的忽略消息形式本身。这样,它可以由通道来关心它是否需要来自自己的消息。这样做可能还有其他含义,但除此之外它看起来很干净。