Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向TCP Netty ChannelGroup中除一个以外的所有人写入_Java_Tcp_Netty_Multicast - Fatal编程技术网

Java 向TCP Netty ChannelGroup中除一个以外的所有人写入

Java 向TCP Netty ChannelGroup中除一个以外的所有人写入,java,tcp,netty,multicast,Java,Tcp,Netty,Multicast,我有一个基于TCP的Netty应用程序,它有多个需要相互通信的客户端。我将所有通道引用存储在通道组中 虽然我知道我可以通过调用ChannelGroup.write向ChannelGroup中的每个客户机进行写入,但除了其中一个以外,向所有通道进行写入的有效方式是什么,例如: ‘A’、‘B’、‘C’都在一个频道组中,而‘A’需要发送到‘B’和‘C’、‘B’需要发送到‘A’和‘C’等。这样做的最佳方式是什么?以下是我想到的一些选择,但请提供一些反馈: 只需遍历组并分别写入通道(在本例中不使用Chan

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

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

‘A’、‘B’、‘C’都在一个频道组中,而‘A’需要发送到‘B’和‘C’、‘B’需要发送到‘A’和‘C’等。这样做的最佳方式是什么?以下是我想到的一些选择,但请提供一些反馈:

  • 只需遍历组并分别写入通道(在本例中不使用ChannelGroup.write)

  • 重复“重新制作/克隆”通道组,使其仅包含要写入的通道。然后我会调用ChannelGroup.write对修改后的组进行写入,然后将该组恢复为完整组

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

  • 就设计权衡而言,消息发送速度尽可能快,通道组相对较小2。据我所知,向频道组写入内容并没有内在的性能优势。如果您查看的代码,它只是在注册的通道中进行迭代,发出写操作并收集未来:

    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);
         }
    
    公共信道组未来写入(对象消息){
    地图期货=
    新LinkedHashMap(size());
    if(ChannelBuffer的消息实例){
    ChannelBuffer buf=(ChannelBuffer)消息;
    对于(通道c:nonServerChannels.values()){
    futures.put(c.getId(),c.write(buf.duplicate());
    }
    }否则{
    对于(通道c:nonServerChannels.values()){
    futures.put(c.getId(),c.write(message));
    }
    }
    返回新的DefaultChannelGroupFuture(本,futures);
    }
    
    。。。。尽管您确实从多路复用的未来中获益,但如果您关心完成回调,这是很有用的

    我也不会做#3,因为您只是给下游处理程序更多的工作要做,丢弃了您费心编写的数据

    因此,我会:

  • 实施方案#1
  • 扩展DefaultChannelGroup并添加一个写方法,该方法足够聪明,可以跳过正在讨论的通道。当您将频道添加到组中时,可能需要提供更多的元数据

  • 我可能会按照选项3做一些事情。如果您真的不希望通道向自己写入,那么在忽略消息本身的通道(或处理程序?)内设置逻辑是有意义的。这样,它就可以由通道来决定是否需要来自自身的消息。这样做可能会有其他的影响,但在其他方面它看起来是干净的。非常感谢您的帮助和分析。非常感谢。