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

标签 java sockets

我有一些基本的 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)

我假设我因为没有正确清理而筋疲力尽,但尽管尝试了 closeflush 的各种组合,但我似乎无法发现什么是的。

最佳答案

您正在用太多的快速连接填满积压队列。发生这种情况时,Linux 将不会响应进一步传入的连接请求(SYN 数据包)。

您应该尽可能长时间地使用相同的连接,并且使用相同的对象流。

关于成功连接和写入次数后 Java 连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31920515/

相关文章:

java - 测试 SocketChannel NIO

java - Selenium :moveByOffset() 不起作用

java - 在一个表达式中将 ArrayList<String> 转换为 String[]?

python - 无法将 'bytes' 对象隐式转换为 str python

sockets - boost::asio::async_resolve 问题

C++ - XCode 和测试端口是否打开

java - 用 Java 编写 GUI,但我的标签似乎从未出现

Java:将主对角线上方和下方形成的三角形的所有元素相加

java - 当我使用 FCM 从 Ruby on Rails 后端发送推送通知时,Android 应用程序关闭

PHP 套接字处于半工作状态