我们的情况如下:


有一个使用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(...)时,它将开始遍历。给定ChannelPipelineChannelHandlerContextChannelPipeline属于ChannelHandler中的特定位置,因为它与之前添加的ChannelGroup“相关”。

2)这不是一个坏主意,但是大多数时候使用Channel.write(...)的用户都想使用ChannelGroup(请参见上文)

3)使用MapMap都可以。使用Channel时,请确保一旦ChannelHandlerContext关闭,便要从Map中删除​​Channel / 。

10-08 20:28