6

この投稿に続いて、私は同じ問題を抱えており、簡単なテストキャストで再現することができました. どうぞよろしくお願いいたします。

説明させてください。ソケットを使用してメッセージを送信しています。so_timeout を 2 分未満に設定している限り、すべてがうまく機能しています。しかし、2 分以上に設定すると、ソケットは 2 分後にタイムアウトになります。したがって、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 クラスを実行する必要があります。

私は長い間この問題に苦しんでおり、助けていただければ幸いです。ありがとうございました。

  • 編集

そのため、SO_TimeOut への依存関係を削除し、この投稿で @Nick の提案を利用して、使用可能な入力ストリームを確認してから読み取るようにしました。しかし、問題は、入力がストリームに書き込まれたにもかかわらず、2 分後に使用可能なバイトが常に 0 を返すことです。だから私はまだ同じ問題を抱えています。

4

2 に答える 2

2

だから私は問題が何であるかを理解しました

socket.shutdownInput();

ソケットを FIN_WAIT 状態に変更するため、閉じる前に 2 分間待機します ( 2MSL )

于 2013-06-10T15:06:57.943 に答える
2

プラットフォームの既定値である約 1 分を超えて接続タイムアウトを増やすことはできません。減らすことしかできません。それを増やそうとしても、実際には意味がありません。何を達成しようとしていますか?

于 2013-06-09T10:10:42.340 に答える