Netty端口被占用問題


問題:
 
最近發現Netty項目每次發布的時候Netty在重啟時都會報端口被 占用的異常, 需要過十幾秒左右手動重啟一遍, Netty才能恢復正常
目前猜測是由於Tomcat_restart的時候Netty執行相關的銷毀操作, Channel.close().awaitUninterrupted() 以及 bossGroup和workerGroup在關閉時socket沒有完全關閉, 也許是處於TIME-WAIT狀態, 導致Netty在重啟的時候報端口被 占用
 
解決:
 
Netty BootStrap有一個Option SO_REUSEADDR, 作用是重用處於TIME_WAIT但是未完全關閉的socket地址, 由於我在本地和dev上在有大量請求的情況下重啟也未發現有端口被 占用的情況, 只能在線上發布的時候才能測試出來, 正好線上發布的那個版本 ... 我忘記開 SO_REUSEADDR了... 所以, 只能下次再看是否有效果了
 
相關:
1) TCP四次揮手
TCP的socket連接在服務端單方面關閉連接時, 會進入如下四次揮手流程(圖片來源於網絡)

 
此時服務端socket如果處於TIME-WAIT狀態, 而又沒有開啟SO_REUSEADDR 則會出現端口被 占用異常
 
2) SO_REUSEADDR(摘自百科)
這個 套接字 選項通知內核,如果端口忙,但TCP狀態位於 TIME_WAIT ,可以重用端口。如果端口忙,而TCP狀態位於其他狀態,重用端口時依舊得到一個錯誤信息,指明"地址已經使用中"。如果你的服務程序停止后想立即重啟,而新 套接字 依舊使用同一端口,此時 SO_REUSEADDR 選項非常有用。必須意識到,此時任何非期望數據到達,都可能導致服務程序反應混亂,不過這只是一種可能,事實上很不可能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM