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

Netty - The Proper Way to Maintain Map of Channels outside of Handlers

我们的场景如下:

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

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

现在的需求是如何写入特定的通道。
我想有一个 ChannelGroup 并使用特定于客户端的 ID 映射(使用 Map<ClientId, ChannelId> 将客户端 ID 映射到通道 ID)来丰富它。通过这种方式,有了客户端 ID,我可以轻松获取频道并向其写入内容。

现在我的问题是:

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

1) Channel 和 ChannelHandler context 上的操作之间的区别在于,当使用例如 Channel.write(...) 时,它将开始遍历 while ChannelPipeline (从尾到头), while使用 ChannelHandlerContext.write(...) 它将从给定的 ChannelHandlerContext 开始 ChannelPipeline 的遍历,它属于 ChannelPipeline 中的特定位置,因为它是 "related" 到 ChannelHandler 之前添加的。

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

3) 使用ChannelGroupMap 都可以。使用 Map 时,只需确保一旦 Channel 关闭,您将从 Map 中删除 Channel / ChannelHandlerContext