10

我在使用netty示例代码-telnet数据包,现在代码可以建立服务器和客户端使用telnet聊天,但客户端只能与服务器交谈。我正在重写它以使客户端可以与所有客户端通信,因此我需要保留一个频道列表,以便当客户端与服务器联系时,服务器可以将消息发送给所有客户端。谁能告诉我如何获得所有客户渠道?(示例代码在此处输入链接描述

4

4 回答 4

14

对于 Netty 4.0.X

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

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

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

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

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

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

希望能帮助到你。

于 2015-01-21T16:06:57.470 回答
6

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

一个线程安全的 Set,包含开放的 Channels 并在它们上提供各种批量操作。使用 ChannelGroup,您可以将 Channel 分类为有意义的组(例如,基于每个服务或每个状态)。关闭的 Channel 会自动从集合中删除,因此您无需担心添加频道。一个 Channel 可以属于多个 ChannelGroup。

于 2012-04-29T22:53:35.473 回答
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);
于 2012-04-30T10:30:06.007 回答
1

channelConnected事件中,从ChannelHandlerContext中获取客户端并将其存储在某个地方(并发集合会很好,例如ConcurrentHashMap)。您还必须实现channelClosed方法以从您的集合中删除断开连接的通道。

于 2012-04-29T14:48:04.807 回答