我们有一个连接到外部计费服务器的应用程序。一旦客户端服务器中断,CLOSE_WAIT状态就有数百个连接。
我检查了客户端代码。似乎客户端正在正确关闭TCP连接。
如果发生这种情况是因为服务器没有因为服务器端的问题而正确关闭连接,是否有办法阻止客户端表单将套接字保持在CLOSE_WAIT状态?
我还观察到线程数和cpu使用率比平时增加了很多。
重启应用程序后,即使数小时后也没有CLOSE_WAIT,并且线程数和cpu使用率恢复正常。
如果服务器有时无法正常关闭连接,除了重新启动客户端以删除CLOSE_WAIT之外,我们还有什么办法吗? (我的意思是有任何代码改进可以防止客户端的这个问题)
我们在客户端使用自定义的JDiameter代码连接到计费服务器。
(我们无法访问服务器端代码)
答案 0 :(得分:2)
如果发生这种情况是因为服务器没有正确关闭连接,因为服务器端存在问题......
没有。
RFC 793个州:“CLOSE_WAIT - 表示等待来自本地用户的连接终止请求。”这意味着对等已关闭连接:TCP已收到FIN,它正在等待本地应用程序执行此操作。
如果你在自己的连接端有这个问题,它表明一件事:你没有关闭自己的套接字。您忽略了套接字上的EOS条件或异常,并且无论如何都继续使用它。
解决方案:不要。 EOS意味着您必须停止读取并关闭套接字。除IOException
以外的任何SocketTimeoutException
均表示相同。