【问题标题】:Writing to all but one in a TCP Netty ChannelGroup写入 TCP Netty ChannelGroup 中除一个之外的所有内容
【发布时间】:2012-05-09 05:26:03
【问题描述】:

我有一个基于 TCP 的 Netty 应用程序,其中有多个需要相互通信的客户端。我将所有 Channel 引用存储在 ChannelGroup 中。

虽然我知道我可以通过调用 ChannelGroup.write 向 ChannelGroup 中的每个客户端写入数据,但是除了其中一个之外,还有什么是写入所有通道的有效方法,例如:

'A','B','C'在一个频道组中,'A'需要发送给'B'和'C','B'需要发送给'A'和'C'等。什么是最好的方法呢?以下是我想到的一些选项,但我们将不胜感激:

  1. 只需遍历 Group 并单独写入通道(在这种情况下不要使用 ChannelGroup.write)

  2. 反复“重新制作/克隆” ChannelGroup,使其仅包含要写入的通道。然后我会在修改后的组上调用 ChannelGroup.write,然后将组恢复到完整组。

  3. 写入所有通道,但实现一些处理程序逻辑以丢弃(在编码或下游处理程序上)并且如果消息来自排除的通道,则不写入。

就设计权衡而言,消息尽可能快地发送,ChannelGroup 相对较小,

非常感谢您的帮助!

【问题讨论】:

  • 我可能会按照选项 3 的方式做一些事情。如果您真的不希望通道向自己写入数据,那么在通道(或处理程序?)中包含逻辑是有意义的忽略消息形式本身。这样,它可以由通道来关心它是否需要来自自己的消息。这样做可能还有其他含义,但除此之外它看起来很干净。

标签: java tcp netty multicast


【解决方案1】:

我不会做#2。据我所知,写入频道组并没有固有的性能优势。如果您查看DefaultChannelGroup 的代码,它只是简单地遍历已注册的通道,发出写入并收集期货:

public ChannelGroupFuture write(Object message) {
         Map<Integer, ChannelFuture> futures =
             new LinkedHashMap<Integer, ChannelFuture>(size());
         if (message instanceof ChannelBuffer) {
             ChannelBuffer buf = (ChannelBuffer) message;
             for (Channel c: nonServerChannels.values()) {
                 futures.put(c.getId(), c.write(buf.duplicate()));
             }
         } else {
             for (Channel c: nonServerChannels.values()) {
                 futures.put(c.getId(), c.write(message));
             }
         }
         return new DefaultChannelGroupFuture(this, futures);
     }

....虽然您确实获得了多路复用未来的好处,但如果您关心完成回调,这很有用。

我也不会做#3,因为你只是给下游处理程序更多的工作要做,丢弃你一开始就费心写的数据。

所以我会:

  1. 实施选项 #1
  2. 扩展 DefaultChannelGroup 并添加一个足够聪明的写入方法以跳过相关通道。将频道添加到组时,您可能需要提供更多元数据。

【讨论】:

  • 非常感谢您的帮助和分析。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
相关资源
最近更新 更多