成功连接和写入次数后的Java连接超时
我有一些基本的java socket客户机/服务器代码,可以在循环中从客户机向服务器发送大量对象: 服务器成功连接和写入次数后的Java连接超时,java,sockets,Java,Sockets,我有一些基本的java socket客户机/服务器代码,可以在循环中从客户机向服务器发送大量对象: 服务器 final ServerSocket listener = new ServerSocket(8080); while (true) { final Socket socket = listener.accept(); try { final ObjectInputStream ois = new ObjectInpu
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();
}
在发送了大约16000个对象之前,这种方法可以正常工作。然后,代码最终会超时,并出现以下情况:
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)
原因:java.net.ConnectException:操作超时
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于java.net.Socket.connect(Socket.java:538)
位于java.net.Socket。(Socket.java:434)
位于java.net.Socket。(Socket.java:211)
位于uk.co.imrichardcole.socket.ObjectSocketClientBenchmark.sendObject(ObjectSocketClientBenchmark.java:39)
我假设我没有正确地清理是在消耗一些东西,但是尽管尝试了
close
和flush
的各种组合,我似乎无法发现它是什么。你用太多的快速连接填满了待办事项队列。当这种情况发生时,Linux将不再响应进一步传入的连接请求(SYN数据包)
您应该尽可能长时间地使用相同的连接,也应该使用相同的对象流。服务器端没有错误吗?服务器端没有错误。在不同的客户端调用(循环中)之间是否有等待时间?您能显示完整的客户端代码吗?@WimDeblauwe原始问题更新仅用于测试:您能在每次
sendObject()
之后添加100毫秒睡眠吗?谢谢。最终的设计看起来不像这样,但通过在上面的设计中添加一个小睡眠,它就可以工作了。@EJP阻塞接受不会从队列中删除条目吗?如果我没记错的话,这个问题应该只有在服务器不执行接受时才会出现。我可能错了。