天天看點

一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)

多路複用器(Selector) 接收到OP_READ事件:

處理OP_READ事件: NioSocketChannel.NioSocketChannelUnsafe.read()

  • 接受資料
  • 判斷接受的資料大小是否<0,如果是,說明是關閉,開始執行關閉:
  1. 關閉channel(包含cancel多路複用器的key)
  2. 清理消息:不接受新資訊,fail 掉所有queue中消息
  3. 觸發fireChannellnactive和fireChannelUnregistered。

源碼

關閉連接配接,會觸發OP_READ 事件:

  • 是以在此增加條件斷點
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)
  • 用戶端斷開連接配接時打斷點
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)
  • 寫資料完成了

讀取位元組數是**-1**代表正常關閉。

一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)
  • 釋放緩存
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)

到了最後,關閉 selection上的 selectionkey,這樣selector 上就不會再發生該channel上的各種事件了。

關閉連接配接的根本 API(JDK 原生)

  • Channel的關閉包含了SelectionKey的cancel
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)

如果發送資料的時候,突然把連接配接關閉掉了,這種不正常的取消連接配接如何執行的呢?

  • 資料讀取進行時,強行關閉,會抛IOException
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)
  • 這裡捕獲
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)
  • 處理 IO 異常
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)
  • 是以正常關閉和異常關閉處理是不同的
一文搞定Netty斷開連接配接原理源碼關閉連接配接的根本 API(JDK 原生)