如何诊断为什么 Java 应用程序无法打开套接字(成功运行一段时间后)

如何诊断为什么 Java 应用程序无法打开套接字(成功运行一段时间后)

我正在尝试诊断为什么基于 Java 的应用程序作为客户端运行一段时间并进行 SOAP Web 服务调用,然后开始遇到无法打开套接字的异常。操作系统是 Windows 2003 Server SP1。

netstat -an 输出显示一些连接处于 CLOSE_WAIT 或 TIME_WAIT 状态,但不足以表明操作系统本身已耗尽套接字。

我怀疑客户端 API 的使用方式存在错误(Axis2 v1.4),导致无法回收某些内部资源。一旦我们遇到无法打开套接字的情况,就必须重新启动 Java 应用程序。(不过,有点奇怪的是,我们仍然可以使用简单的 java.net.URL 进行调用)。

我想知道我们是否可以使用 Wireshark/Ethereal 或类似软件来帮助从操作系统/网络的角度诊断问题?

如果有用的话,我们的 Java 堆栈跟踪是:

原因:java.net.ConnectException:连接超时:在 java.net.PlainSocketImpl.socketConnect(Native Method)处连接,在 java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)处连接,在 java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)处连接,在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)处连接,在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)处连接,在 java.net.Socket.connect(Socket.java:516)处连接,在 java.net.Socket.connect(Socket.java:466)处连接,在 java.net.Socket.(Socket.java:366)处连接,在 java.net.Socket.(Socket.java:239)

非常感谢您的见解。Dan Haywood

答案1

Java 堆栈跟踪的第一行显示java.net.ConnectException: Connection timed out。这表明客户端成功创建了客户端套接字并尝试联系服务器,但没有返回任何响应。您的问题不在于客户端。我的建议是调查远程服务器是否已启动。接下来确保没有网络问题阻止客户端联系服务器。

相关内容