我有一个在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处理程序中(这可能是一个稍微苛刻的反应但我不想改变这个直到我理解更多的问题充分)。这是堆栈跟踪:
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。我想我可以消除狡猾的网络设备,因为连接将转移到localhost。
我可以通过捕获SocketException而不是ConnectionException来解决这个问题,但我不想掩盖这个问题,至少在我理解它之前。有没有人对可能导致错误的原因有任何想法?
答案 0 :(得分:2)
可能的原因可能是您的系统耗尽了Socket()创建的端口(偶尔)。使用连接池可能会有所帮助。如果在您的情况下这是一个可行的选项,这将有助于避免每次创建新的Socket。
对于linux,可以通过命令
列出打开的套接字数量netstat -n。
可以通过命令
检查打开文件数量的限制(linux将套接字视为文件)的ulimit