首页 > 代码库 > Netty3 源码分析 - ChannelEvent

Netty3 源码分析 - ChannelEvent

Netty3 源码分析 - ChannelEvent

     ChannelEvent是和这个Channel相关的IO事件和请求,会由各个ChannelHandler来处理。
     事件分为上行和下行两种。当服务器从客户端收到一个消息,那么与之相关的就是一个上行事件(upstream event),流水线中的UpstreamChannelHandler会处理它;如果服务要回应这个客户端,那么与响应消息对应的就是下行事件,pipeline中的DownstreamChannelHandler会处理。站在客户端角度同样很容易理解。上行事件通常是入站操作(inbound operations)的结果,如 InputStream.read(byte[]),下行事件通常是请求出站操作( outbound operations)比如 OutputStream.write(byte[]), Socket.connect(SocketAddress), and Socket.close()。
上行事件及发生时机

Event name

Event type and condition

Meaning

"messageReceived"

MessageEvent

a message object (e.g. ChannelBuffer) was received from a remote peer

"exceptionCaught"

ExceptionEvent

an exception was raised by an I/O thread or a ChannelHandler

"channelOpen"

ChannelStateEvent
(state = OPEN, value = true)

Channel is open, but not bound nor connected

Be aware that this event is fired from within the I/O thread. You should never execute any heavy operation in there as it will block the dispatching to other workers!

"channelClosed"

ChannelStateEvent
(state = OPEN, value = false)

Channel was closed and all its related resources were released

 

"channelBound"

ChannelStateEvent
(state = BOUND, value = SocketAddress)

Channel is open and bound to a local address, but not connected.

Be aware that this event is fired from within the I/O thread. You should never execute any heavy operation in there as it will block the dispatching to other workers!

"channelUnbound"

ChannelStateEvent
(state = BOUND, value = null)

Channel was unbound from the current local address

 

"channelConnected"

ChannelStateEvent
(state = CONNECTED, value = SocketAddress)

Channel is open, bound to a local address, and connected to a remote address

Be aware that this event is fired from within the I/O thread. You should never execute any heavy operation in there as it will block the dispatching to other workers!

"writeComplete"

WriteCompletionEvent

something has been written to a remote peer

 

"channelDisconnected"

ChannelStateEvent
(state = CONNECTED, value = null)

Channel was disconnected from its remote peer

 

"channelInterestChanged"

ChannelStateEvent
(state = INTEREST_OPS, no value)

Channel‘s interestOps was changed


对于可以有子通道的Channel(如ServerSocketChannel)而言可以有下面俩事件。

Event name

Event type and condition

Meaning

"childChannelOpen"

ChildChannelStateEvent
(childChannel.isOpen() = true)

a child Channel was open (e.g. a server channel accepted a connection.)

"childChannelClosed"

ChildChannelStateEvent
(childChannel.isOpen() = false)

a child Channel was closed (e.g. the accepted connection was closed.)

   
下行事件及发生时机

Event name

Event type and condition

Meaning

"write"

MessageEvent

Send a message to the Channel.

"bind"

ChannelStateEvent
(state = BOUND, value = SocketAddress)

Bind the Channel to the specified local address.

"unbind"

ChannelStateEvent
(state = BOUND, value = null)

Unbind the Channel from the current local address.

"connect"

ChannelStateEvent
(state = CONNECTED, value = SocketAddress)

Connect the Channel to the specified remote address.

"disconnect"

ChannelStateEvent
(state = CONNECTED, value = null)

Disconnect the Channel from the current remote address.

"close"

ChannelStateEvent
(state = OPEN, value = false)

Close the Channel.
注意上表没有“open”状态,因为当一个Channel由ChannelFactory创建的时候就会默认打开。

总结:netty是事件驱动,所以至少先弄明白各个事件如何产生,以及发生的条件。这些事件推动着状体的变迁。















Netty3 源码分析 - ChannelEvent