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