我使用的是netty示例代码 - telnet数据包,现在代码可以建立服务器和客户端使用telnet进行聊天,但客户端只能与服务器通信。我正在重写它以使客户端可以与所有客户端通信,因此我需要保留一个通道列表,因此当客户端联系服务器时,服务器可以将消息发送给所有客户端。 谁能告诉我怎样才能让所有客户通道? (示例代码为enter link description here)
答案 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 方法,以从您的收藏中删除已断开连接的频道。