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