java - Java 客户端连接到本地主机时出现无法解释的 SocketException

标签 java sockets

我有一个在 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/

相关文章:

c++ - 一些进展。发送调用没有到达 nodejs 土地

java - 套接字文件传输无法正确读取

java - 使用 PDFBox 断言 PDF 中的文本 - Selenium/java

java - 从 java LL 中删除特定项目

java - Java 中的 Android 和 IPv6

java - 访问子节点的长度返回原始计数的两倍

java - 如何在 Eclipse Jet 中生成代码时抛出异常?

c - UDP recvfrom查询

python - SocketServer ThreadingTCPServer & Asyncore Dispatcher

linux - 从多个线程在套接字上发送 Recv