參考:
https://www.cnblogs.com/imstudy/p/9908791.html
https://blog.csdn.net/eric_sunah/article/details/80424344
https://blog.csdn.net/eric_sunah/article/details/80424381
NETTY
//netty version: 3.1.5GA //file: org.jboss.netty.channel.socket.nio.NioWorker.java //method: static void close(NioSocketChannel channel, ChannelFuture future) //line: 581 future.setSuccess(); if (connected) { fireChannelDisconnected(channel); } if (bound) { fireChannelUnbound(channel); } cleanUpWriteBuffer(channel); fireChannelClosed(channel);
我們可以看到,在上述代碼中,在close channel的時候,會先判斷當前channel是否處於connected狀態,即是否已經成功地與遠程地址建立了連接,如果是的話,就觸發channelDisconnected事件;最后,再統一觸發channelClosed事件。
也就是說,任何對NioWorker.close(NioSocketChannel channel, ChannelFuture future)方法的調用都會觸發channelClosed事件,這些事件可能包括如下幾種:
1. 已經與遠程主機建立的連接,遠程主機主動關閉連接,或者網絡異常連接被斷開的情況
2. 已經與遠程主機建立的連接,本地客戶機主動關閉連接的情況
3. 本地客戶機在試圖與遠程主機建立連接時,遇到類似與connection refused這樣的異常,未能連接成功時
而只有當本地客戶機已經成功的與遠程主機建立連接(connected)時,連接斷開的時候才會觸發channelDisconnected事件,即對應上述的1和2兩種情況。