日期:2014-05-20  浏览次数:20928 次

socket 服务器端 大量CLOSE_WAIT 状态连接
    最近与三家运营商对接数据(我方为服务器端),为每个运营商发布一个应用。两家连接均正常,其中一家每过一两天后就会出现大量的CLOSE_WAIT连接(netstat -t 或lsof -i:8001),导致程序异常对方不能再次连接,必须重启应用。
    在java 中能否通过相关参数来控制(Linux系统),救解
------解决方案--------------------
Java自己不行,涉及到参数修改的执行权限问题,你用Runtime试试看吧;

主要是要调操作系统参数,大幅减少CLOSE_WAIT等待时间。

这种问题一般是因为网络异常 或 对方没有答复CLOSE所导致。
------解决方案--------------------
// 绑定套接字前启用 SO_REUSEADDR 允许在上一个连接处于超时状态时绑定套接字。
socket.setReuseAddress(getSoReuseAddress());  -> 设置为on
// close关闭的的延迟时间,为了尽可能将package发送出去。
// 在默认情况下,当调用close方法后,将立即返回;如果这时仍然有未被送出的数据包,那么这些数据包将被丢弃。
// 如果将linger参数设为一个正整数n时(n的值最大是65,535),在调用close方法后,将最多被阻塞n秒。
// 在这n秒内,系统将尽量将未送出的数据包发送出去;如果超过了n秒,如果还有未发送的数据包,这些数据包将全部被丢弃;
socket.setSoLinger(getSoLingerOn(),getSoLingerTime());