Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
成功连接和写入次数后的Java连接超时_Java_Sockets - Fatal编程技术网

成功连接和写入次数后的Java连接超时

成功连接和写入次数后的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

我有一些基本的java socket客户机/服务器代码,可以在循环中从客户机向服务器发送大量对象:

服务器

    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阻塞接受不会从队列中删除条目吗?如果我没记错的话,这个问题应该只有在服务器不执行接受时才会出现。我可能错了。