多路複用器(Selector) 接收到OP_READ事件:
處理OP_READ事件: NioSocketChannel.NioSocketChannelUnsafe.read()
- 接受資料
- 判斷接受的資料大小是否<0,如果是,說明是關閉,開始執行關閉:
- 關閉channel(包含cancel多路複用器的key)
- 清理消息:不接受新資訊,fail 掉所有queue中消息
- 觸發fireChannellnactive和fireChannelUnregistered。
源碼
關閉連接配接,會觸發OP_READ 事件:
- 是以在此增加條件斷點

- 用戶端斷開連接配接時打斷點
- 寫資料完成了
讀取位元組數是**-1**代表正常關閉。
- 釋放緩存
到了最後,關閉 selection上的 selectionkey,這樣selector 上就不會再發生該channel上的各種事件了。
關閉連接配接的根本 API(JDK 原生)
- Channel的關閉包含了SelectionKey的cancel
如果發送資料的時候,突然把連接配接關閉掉了,這種不正常的取消連接配接如何執行的呢?
- 資料讀取進行時,強行關閉,會抛IOException
- 這裡捕獲
- 處理 IO 異常
- 是以正常關閉和異常關閉處理是不同的