我有一些基本的 java 套接字客户端/服务器代码,用于在循环中将多个对象从客户端发送到服务器:
服务器
final ServerSocket listener = new ServerSocket(8080);
while (true) {
final Socket socket = listener.accept();
try {
final ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
final Object object = ois.readObject();
ois.close();
socket.close();
} catch (Exception e) {
throw new RuntimeException("error", e);
}
}
客户端
public void go() {
try {
while (true) {
sendObject();
}
} catch (Exception e) {
throw new RuntimeException("error", e);
}
}
private void sendObject() throws IOException {
final Socket socket = new Socket("localhost", 8080);
final ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(result);
out.close();
socket.close();
}
在发送了大约 16,000 个对象之前,这一切正常。然后代码最终超时并显示以下内容:
Caused by: java.net.ConnectException: Operation timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at uk.co.imrichardcole.socket.ObjectSocketClientBenchmark.sendObject(ObjectSocketClientBenchmark.java:39)
我假设我因为没有正确清理而筋疲力尽,但尽管尝试了 close
和 flush
的各种组合,但我似乎无法发现什么是的。
最佳答案
您正在用太多的快速连接填满积压队列。发生这种情况时,Linux 将不会响应进一步传入的连接请求(SYN 数据包)。
您应该尽可能长时间地使用相同的连接,并且使用相同的对象流。
关于成功连接和写入次数后 Java 连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31920515/