4

Netty 通道有多种状态,但我无法找到有关实际状态转换的任何文档。我可以找到的最接近 Netty 3.2.x 系统的任何文档在 这里

我能够在 此处找到通道可能处于的状态。

然而,没有任何东西可以描述通道从一种状态到另一种状态的正常转换。似乎并非所有通道都会进行所有可能的状态转换。

4

1 回答 1

4

不同的 Netty 通道确实有不同的状态转换。

一般来说,基于 TCP 的服务器通道可能的状态转换是:

OPEN -> ( BOUND -> UNBOUND )* -> CLOSE

如果您在管道中使用SimpleChannelHandler子类,则在发生这些状态更改之一时处理上游事件的等效方法是:

channelOpen
channelBound
channelUnbound
channelClose

服务器通道永远不会进入CONNECTED状态。

服务器通道一旦进入UNBOUND状态,很少会回到BOUND状态,但这似乎取决于应用程序,因此 YMMV。

请注意,服务器通道可以在子通道打开或关闭时触发事件。这些事件只能在服务器通道处于BOUND状态后发生。当这些事件代表服务器通道向上游发送时,将调用SimpleChannelHandler子类上的以下方法:

childChannelOpen
childChannelClosed

基于 TCP 的子通道和客户端通道的可能状态转换是:

OPEN -> ( BOUND -> ( CONNECTED -> DISCONNECTED )* -> UNBOUND )* -> CLOSE

看起来首先进入CONNECTED状态并不是 在通道代码中强制执行的;然而,在 Netty 框架内的子通道和客户端通道进入CONNECTED状态之前,这个状态总是首先被触发。

如果您在管道中使用SimpleChannelHandler或其子类,则等效方法是:

channelOpen
channelBound
channelConnected
channelDisconnected
channelUnbound
channelClose

基于 TCP 的通道必须处于CONNECTED状态,然后才能读取或写入通道。这包括服务器通道,它们永远不能被读取或写入,这并不奇怪,因为服务器通道总是仅用于代表服务器管理连接操作。

数据报套接字的运行方式与基于 TCP 的套接字不同,因为它们可用于在没有实际连接的情况下读取和写入数据(尽管连接数据报套接字会更快,因为您避免了安全检查)。使用上面描述的基于 TCP 的子通道和服务器通道列出的状态转换,可以有效地使用数据报套接字。

于 2012-11-13T06:53:08.930 回答