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 选项很是有用。必须意识到,此时任何非指望数据到达,均可能致使服务程序反应混乱,不过这只是一种可能,事实上很不可能
相关文章
相关标签/搜索