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

che*_*gpc 8 java networking netty

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

HCa*_*sko 11

对于Netty 4.0.X

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

 final ChannelGroup channels = 
                new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
Run Code Online (Sandbox Code Playgroud)

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

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
    channels.add(ctx.channel());
}
Run Code Online (Sandbox Code Playgroud)

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

for (Channel ch : channels) {
    //do something with ch object
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


Nic*_*las 5

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

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


Mau*_*res 1

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