什么是Netty Channel状态转换?

时间:2012-11-13 06:53:09

标签: tcp udp netty datagram socketchannel

Netty频道有多个州,但我找不到 关于实际状态转换的文档。最接近任何 我可以找到Netty 3.2.x系统的文档 here

我能够找到频道可能处于的状态 here

然而,没有任何描述a的正常过渡 渠道可以从一个州到另一个州。似乎不是全部 通道使所有可能的状态转换。

1 个答案:

答案 0 :(得分:4)

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

通常,基于TCP的服务器可能存在状态转换 渠道是:

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

如果您在管道中使用 SimpleChannelHandler 子类 其中一个处理上游事件的等效方法 这些状态变化发生在:

channelOpen
channelBound
channelUnbound
channelClose

服务器频道从不进入 CONNECTED 状态。

服务器频道一旦进入,很少会回到 BOUND 状态 进入 UNBOUND 状态,但这似乎是依赖的 在申请上如此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的子和列出的两个状态转换 上述服务器频道。