【发布时间】:2011-05-25 02:37:33
【问题描述】:
我正在用 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 方法来关闭它。我还有一个 finalize 方法来关闭 ServerSocket 所以我不知道问题是什么。
同样在我收到错误后,如果我立即再次运行程序,它会比以前更快地遇到问题。然后,如果我等待一段时间并运行它,它就会回到原来的时间。
我真的无法解决这个问题,而且我多年来一直在尝试解决这个问题。有谁知道问题出在哪里?
提前致谢!
更新:
所以我已经弄清楚错误来自哪里,这真的很奇怪。我有以下导致问题的代码:
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();
}
}
如您所见,代码应该打开一个套接字并写入它。然而,即使所有功能代码都被注释掉,所以套接字只是打开然后立即关闭,我仍然得到“没有缓冲区空间”的错误。
我真的不知道为什么会这样。该程序是多线程的,每个线程使用上述方法定期创建对象并调用它。当创建和关闭套接字的行被删除时,我不再收到错误,但是当它们出现时,即使套接字打开然后立即关闭,我也会收到错误。
有人知道为什么会这样吗?
非常感谢。
【问题讨论】:
-
问题是否取决于打开/关闭的套接字数量?修改后的代码是 only 打开套接字的代码吗?是否可重复运行?
标签: java sockets tcp buffer serversocket