尽管设置为超过两分钟,但套接字在两分钟后超时

2024-02-08

下列的这个帖子 https://stackoverflow.com/questions/12406628/java-socket-read-time-out-exception,我有同样的问题,我设法通过一个简单的测试来重现它。我希望你能帮助我。

让我解释一下,我正在使用套接字发送消息。只要我将 so_timeout 设置为少于两分钟,一切都会很好。但如果我将其设置为超过两分钟,则套接字将在两分钟后超时。因此,如果我将 so_timeout 设置为 10 秒,则套接字将在 10 秒后超时,但如果将其设置为 180 秒,则套接字将在 120 秒后超时。

这是一个测试用例:

import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;

/**
 *
 */
public class TestSocket1 {

public static void main(String[] args) throws IOException {

    ServerSocket serverSocket = new ServerSocket();

    serverSocket.setReuseAddress(true);
    serverSocket.bind(new InetSocketAddress(1111), 0);
    serverSocket.setSoTimeout(1000);
    Socket socket = null;

    boolean send = true;

    while (send) {
        try {
            socket = serverSocket.accept();
            Thread.sleep(100);
            String messageReceived = readFromSocket(socket);

            System.out.println(messageReceived);

            if (send) {
                send = false;

                Thread.sleep(150000); // Causing 2.5 minutes delay
                // Sending message

                BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
                PrintWriter printWriter = new PrintWriter(wr, true);

                String output = "Hello Back";

                printWriter.println(output);
                printWriter.flush();
                socket.shutdownOutput();

            }

        }
        catch (SocketTimeoutException ie) {
        }
        catch (Exception e) {
        }
        finally {
            if (socket != null) {
                socket.close();
            }
        }
    }


}

protected static String readFromSocket(Socket socket) throws IOException {
    StringBuilder messageReceived = new StringBuilder();
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));

    String line = br.readLine();

    messageReceived.append(line);

    socket.shutdownInput();

    return messageReceived.toString();
}


}

import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

/**
 *
 */
public class TestSocket2 {

public static void main(String[] args) throws IOException {

    Socket socket = new Socket();
    socket.setKeepAlive(true);
    socket.setReuseAddress(true);
    socket.setTcpNoDelay(true);
    socket.setSoTimeout(180000); // Should wait 3 minutes before throwing time out exception - Actually throwing after 2 minutes

    SocketAddress socketAddress = new InetSocketAddress(1111);

    socket.connect(socketAddress, 5000);

    // Sending message

    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
    PrintWriter printWriter = new PrintWriter(wr, true);

    String output = "Hello There";

    printWriter.println(output);
    printWriter.flush();
    socket.shutdownOutput();

    String messageReceived = readFromSocket(socket);

    System.out.println(messageReceived);

}

protected static String readFromSocket(Socket socket) throws IOException {
    StringBuilder messageReceived = new StringBuilder();
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));

    String line = br.readLine();

    messageReceived.append(line);

    socket.shutdownInput();

    return messageReceived.toString();
}


}

您应该首先运行 TestSocket1 类,然后运行 ​​TestSocket2。

我长期以来一直在解决这个问题,任何帮助将不胜感激。谢谢。

  • EDIT

所以我删除了对 SO_TimeOut 的依赖并采纳了 @Nick 建议这个帖子 https://stackoverflow.com/questions/1306119/setsotimeout-on-a-client-socket-doesnt-affect-the-socket在读取之前检查可用的输入流。但现在的问题是,两分钟后,尽管输入已写入流,但可用字节始终返回 0。所以我仍然有同样的问题。


您无法将连接超时增加到超出平台默认值(大约一分钟)。你只能减少它。试图增加它实际上没有意义。你想达到什么目的?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管设置为超过两分钟,但套接字在两分钟后超时 的相关文章

随机推荐