Netty - 在处理程序外部维护通道映射的正确方法



我们的场景如下:

  1. 有一个使用Netty编写的TCP服务器。
  2. 有多个客户端建立与服务器的连接。
  3. 建立连接后,可以在两个方向上发送消息。

为了能够将消息传递给正确的收件人,我需要在处理程序之外维护通道。我知道ChannelGroup它让我可以轻松实现广播服务器(向所有客户端发送一条消息(。

现在的要求是如何写入特定通道。
我正在考虑有一个ChannelGroup并使用特定于客户端的 id 映射(使用将客户端 ID 映射到通道 ID 的Map<ClientId, ChannelId>(来丰富它。这样,有了客户端 ID,我可以轻松获取频道并写入它。

现在我的问题是:

  1. 一般来说,通过ChannelHandlerContext和通过Channel写作有什么区别?(因为ChannelGroup给了我Channel而不是ChannelHandlerContext(。
  2. 维护ChannelHandlerContext组是个坏主意吗?(换句话说,为什么我们没有ChannelHandlerContextGroup(?
  3. 还有其他建议如何做吗?

1( 在通道与通道处理程序上下文上的操作之间的区别在于,当使用例如Channel.write(...)时,它将开始遍历 whileChannelPipeline(从尾部到头部(,而使用ChannelHandlerContext.write(...)它将从属于ChannelPipeline中特定位置的给定ChannelHandlerContext开始遍历ChannelPipeline,因为它与之前添加的ChannelHandler"相关"。

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

3(使用ChannelGroupMap都可以。使用Map时,只需确保在Channel关闭后从Map上取下Channel/ChannelHandlerContext

最新更新