Netty - 如何获得所有客户端频道?

时间:2012-04-29 14:17:56

标签: java networking netty

我使用的是netty示例代码 - telnet数据包,现在代码可以建立服务器和客户端使用telnet进行聊天,但客户端只能与服务器通信。我正在重写它以使客户端可以与所有客户端通信,因此我需要保留一个通道列表,因此当客户端联系服务器时,服务器可以将消息发送给所有客户端。 谁能告诉我怎样才能让所有客户通道? (示例代码为enter link description here

4 个答案:

答案 0 :(得分:11)

对于Netty 4.0.X

在主类中,您需要声明ChannelGroup对象:

 final ChannelGroup channels = 
                new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

连接新客户端时(应将构造函数中的channels对象传递给处理程序类):

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
    channels.add(ctx.channel());
}

要获取所有客户端,只需迭代通道对象:

for (Channel ch : channels) {
    //do something with ch object
}

希望它有所帮助。

答案 1 :(得分:5)

Mauricio的建议很好。此外,Netty API已在ChannelGroup中提供了一个频道容器。它是线程安全的,还提供了一些附加功能,例如对所有包含的通道进行组操作,以及在关闭时自动删除包含的通道。来自javadoc:

  

包含开放频道并提供各种频道的线程安全套装   批量操作。使用ChannelGroup,您可以进行分类   将频道转换为有意义的组(例如,按服务或按州)   基础。)一个封闭的频道会自动从集合中删除,   这样你就不必担心添加的生命周期了   渠道。频道可以属于多个频道组。

答案 2 :(得分:3)

这是一个小例子(覆盖SimpleChannelUpstreamHandler的channelConnected):

ChannelGroup allConnected = new DefaultChannelGroup("all-connected");

@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
    super.channelConnected(ctx, e);
    allConnected.add(e.getChannel());
}

您现在可以向所有连接的频道发送消息,如下所示:

    ChannelBuffer cb = ChannelBuffers.wrappedBuffer("hello".getBytes(Charset.forName("UTF-8")));
    allConnected.write(cb);

答案 3 :(得分:1)

channelConnected 事件中,从 ChannelHandlerContext 中抓取客户端并将其存储在某处(并发集合会很好,例如 {{ 3}} )。您还必须实施 ConcurrentHashMap 方法,以从您的收藏中删除已断开连接的频道。