我们的情况如下:
有一个使用Netty编写的TCP服务器。
有多个客户端建立与服务器的连接。
建立连接后,可以在两个方向上发送消息。
为了能够将消息传递给正确的收件人,我需要在处理程序之外维护通道。我知道ChannelGroup
可以让我轻松地实现广播服务器(向所有客户端发送一条消息)。
现在的要求是如何写入特定通道。
我正在考虑有一个ChannelGroup
,并用特定于客户端的id映射(用Map<ClientId, ChannelId>
将client-id映射到channel-id)来充实它。这样,有了一个客户端ID,我就可以轻松获取通道并对其进行写入。
现在我的问题是:
通常,通过ChannelHandlerContext
和通过Channel
编写有什么区别? (因为ChannelGroup
给了我Channel
而不是ChannelHandlerContext
)。
维持ChannelHandlerContext
组是一个坏主意吗? (换句话说,为什么我们没有ChannelHandlerContextGroup
)?
还有其他建议怎么做?
最佳答案
1)在Channel与ChannelHandler上下文上进行操作的区别在于,例如使用Channel.write(...)
时,它将开始遍历while ChannelPipeline
(从尾部到头部),而使用ChannelHandlerContext.write(...)
时,它将开始遍历。给定ChannelPipeline
中ChannelHandlerContext
的ChannelPipeline
属于ChannelHandler
中的特定位置,因为它与之前添加的ChannelGroup
“相关”。
2)这不是一个坏主意,但是大多数时候使用Channel.write(...)
的用户都想使用ChannelGroup
(请参见上文)
3)使用Map
或Map
都可以。使用Channel
时,请确保一旦ChannelHandlerContext
关闭,便要从Map
中删除Channel
/ 。