我有一个在 iSeries 上运行的 Java 程序,它连接到同一主机上的服务器进程。下面是 Java 客户端代码的编辑版本:
while (true) {
try {
socket = new Socket(myHost, myPort);
} catch (UnknownHostException ex) {
// Quit
} catch (ConnectException ex) {
// Wait for a while and retry
continue;
} catch (IOException ex) {
// Quit
}
break;
}
// Do stuff with socket...
有时,在调用 Socket() 构造函数时,我会收到一个 SocketException,它落入退出应用程序的 IOException 处理程序中(这可能是一个稍微苛刻的 react ,但在我更了解问题之前我不想更改它)完全)。这是堆栈跟踪:
java.net.SocketException: A connection with a remote socket was reset by that
at java.lang.Throwable.<init>(Throwable.java:195)
at java.lang.Exception.<init>(Exception.java:41)
at java.io.IOException.<init>(IOException.java:40)
at java.net.SocketException.<init>(SocketException.java:29)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:488)
at java.net.Socket.connect(Socket.java:438)
at java.net.Socket.<init>(Socket.java:148)
at com.foo.AccessObject.<init>(AccessObject.java:36)
我知道,如果我正在从套接字读取数据,而另一个对等方关闭了它,我将收到 SocketException。我还了解到,如果连接失败,我将收到 ConnectionException。我不明白的是如何在创建 Socket 时获得 SocketException。我认为我可以消除狡猾的网络设备,因为连接将连接到本地主机。
我可以通过捕获 SocketException 而不是 ConnectionException 来解决这个问题,但我不想掩盖这个问题,至少在我进一步了解它之前是这样。有谁知道可能导致错误的原因吗?
最佳答案
可能的原因可能是您的系统(偶尔)耗尽了 Socket() 创建的端口。使用连接池可能会有所帮助。如果这在您的情况下是可行的选择,这将有助于避免每次都创建新的套接字。
对于linux,可以通过命令列出打开的套接字数量,
netstat -n.
可以通过命令检查打开文件数量的限制(linux将套接字视为文件),
ulimit
关于java - Java 客户端连接到本地主机时出现无法解释的 SocketException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212155/