Java 插座在两分钟后超时,但设置为两分钟以上

Java 插座在两分钟后超时,但设置为两分钟以上,java,sockets,Java,Sockets,接下来,我遇到了同样的问题,我通过一个简单的测试来重现它。我希望你能帮助我 让我解释一下,我正在使用套接字发送消息。只要我将so_超时设置为少于两分钟,一切都很正常。但如果我将其设置为两分钟以上,则两分钟后插座将超时。因此,如果我将So_超时设置为10秒,套接字将在10秒后超时,但如果我将其设置为180秒,套接字将在120秒后超时 下面是一个测试用例: import java.io.*; import java.net.InetSocketAddress; import java.net.Ser

接下来,我遇到了同样的问题,我通过一个简单的测试来重现它。我希望你能帮助我

让我解释一下,我正在使用套接字发送消息。只要我将so_超时设置为少于两分钟,一切都很正常。但如果我将其设置为两分钟以上,则两分钟后插座将超时。因此,如果我将So_超时设置为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();
}


}

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

我为这个问题挣扎了很长一段时间,任何帮助都将不胜感激。多谢各位

  • 编辑

因此,我删除了对sou TimeOut的依赖,并在读取之前引入@Nick suggestion来检查可用的输入流。但现在的问题是,两分钟后,可用字节始终返回0,尽管输入已写入流。所以我仍然有同样的问题。

您不能将连接超时增加到平台默认值之外,即大约一分钟。你只能减少它。试图增加它实际上没有意义。你想做什么?

所以我找到了问题所在

socket.shutdownInput();

使套接字更改为FIN_WAIT状态,从而在关闭前等待2分钟()

我已经在我的笔记本电脑(OS X 10.8.4,JDK 1.6.0_37)上测试了您的代码,并且如预期的那样,
TimeoutException
在180分钟后抛出。您能提供您的操作系统版本和JDK版本吗?操作系统Windows7 Ultimate SP1 64位,JDK jdk1.6.026。顺便说一句,如果你没有被限制在两分钟之内,你不应该看到TimeoutException。请注意,睡眠时间为2.5分钟,SoTimeOut设置为3分钟,因此您应该会看到“Hello Back”消息。抱歉,我忘了提到我已将睡眠时间增加到25分钟,以重现
TimeoutException
。我不熟悉windows平台,希望其他人能提供帮助。我也希望如此,谢谢看起来有人也遇到过这个问题,您可以在中查看答案。好的,首先我找不到有关windows默认套接字超时的任何信息。如果您能添加链接,我将不胜感激。其次,setSoTimeout文档说明超时为零被解释为无限超时,那么我怎么知道它被限制为平台的默认值(同样,我找不到任何关于这方面的信息)?第三,我正在尝试修复一个旧系统中的错误,该系统允许在套接字之间发送消息,这可能需要两分钟以上的时间。如果您根本不设置它,或者将它设置为零,那么在适当的情况下,您肯定会得到一个连接超时。但是,您的评论是关于读取超时的,这是另一回事。您可以将读取超时设置为任意值。我从来没有见过它有问题,我经常使用Windows套接字读取超时。javadocs指的是读取超时。如果您从未遇到过Windows套接字读取超时问题,如果您能够运行测试用例并自行检查,我将不胜感激。谢谢。以下是javadocs:如果将此选项设置为非零超时,则对与此套接字关联的InputStream的read()调用将仅阻塞此时间。FIN\u WAIT\u 1不会导致超时。我想您不明白我的答案。这就是问题所在,我有一个测试用例来证明这一点,因此我无法理解为什么你-我。你不知道谁否决了你,而且FIN_WAIT状态不会导致应用程序超时。
socket.shutdownInput();