netty中channelDisconnected和channelClosed这两个事件的区别

在netty框架中,类似org.jboss.netty.channel.SimpleChannelUpstreamHandler这样的关于NIO事件处理的抽象基类或接口都提供了channelClosed和channelDisconnected这两个接口,从字面意思分析,它们分别是“连接断开”和“连接关闭”的意思,语义非常相近,那么他们具体有什么区别的,笔者在org.jboss.netty.channel.socket.nio.NioWorker.java中找到了答案:
 
 
01 //netty version: 3.1.5GA
02 //file: org.jboss.netty.channel.socket.nio.NioWorker.java
03 //method: static void close(NioSocketChannel channel, ChannelFuture future)
04 //line: 581
05   
06 future.setSuccess();
07 if (connected) {
08     fireChannelDisconnected(channel);
09 }
10 if (bound) {
11     fireChannelUnbound(channel);
12 }
13   
14 cleanUpWriteBuffer(channel);
15 fireChannelClosed(channel);


 
我们可以看到,在上述代码中,在close channel的时候,会先判断当前channel是否处于connected状态,即是否已经成功地与远程地址建立了连接,如果是的话,就触发channelDisconnected事件;最后,再统一触发channelClosed事件。
 
也就是说,任何对NioWorker.close(NioSocketChannel channel, ChannelFuture future)方法的调用都会触发channelClosed事件,这些事件可能包括如下几种:
1. 已经与远程主机建立的连接,远程主机主动关闭连接,或者网络异常连接被断开的情况
2. 已经与远程主机建立的连接,本地客户机主动关闭连接的情况
3. 本地客户机在试图与远程主机建立连接时,遇到类似与connection refused这样的异常,未能连接成功时 
而只有当本地客户机已经成功的与远程主机建立连接(connected)时,连接断开的时候才会触发channelDisconnected事件,即对应上述的1和2两种情况。
上述猜想已经通过编写测试代码,模拟不同的情况得到了证实,如果还有不准确的地方,欢迎指正。
 
转载: http://piouse-leo.appspot.com/2011/04/25/differences-between-channelClosed-and-channelDisconnecte...
 

你可能感兴趣的:(网络框架)