この投稿に続いて、私は同じ問題を抱えており、簡単なテストキャストで再現することができました. どうぞよろしくお願いいたします。
説明させてください。ソケットを使用してメッセージを送信しています。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 を返すことです。だから私はまだ同じ問題を抱えています。