我正在用 Java 编写一个网络程序。我使用 ServerSocket 和 Socket 对象通过 TCP 发送和接收消息。如果我的程序运行时间很短,我的程序运行良好,但是如果我运行它更长的时间,我会收到以下错误:
java.net.SocketException: No buffer space available (maximum connections reached?): connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
我认为这可能是因为我没有关闭所有套接字,但我更改了代码:我有一个类,当我想要一个新套接字时创建一个类,并添加了一个 finalize 方法来关闭它。我还有一个关闭 ServerSocket 的 finalize 方法,所以我不知道问题是什么。
同样在我收到错误后,如果我立即再次运行该程序,它会比以前更快地遇到问题。然后,如果我等待一段时间并运行它,它会回到原来的时间。
我真的无法解决这个问题,我一直在努力解决这个问题。有谁知道问题是什么?
提前致谢!
更新:
所以我已经弄清楚错误来自哪里,这真的很奇怪。我有以下导致问题的代码:
try {
sock = new Socket(InetAddress.getByName(ipaddr), port);
sock.close();
// os = sock.getOutputStream();
// byte[] arr = s.getBytes();
// os.write(arr);
// os.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sock.close();
} catch (Exception e) {
e.printStackTrace();
}
}
如您所见,代码应该打开一个套接字并写入它。但是,即使所有功能代码都像上面那样被注释掉,所以套接字只是打开然后立即关闭,我仍然得到“没有缓冲区空间”错误。
我真的不知道为什么会这样。该程序是多线程的,每个线程使用上述方法定期创建对象并调用它。当创建和关闭套接字的行被删除时,我不再收到错误,但是当它们在那里时,即使套接字打开然后立即关闭,我也会收到错误。
有谁知道为什么会这样?
非常感谢。