folgende this post eingestellt habe, habe ich das gleiche Problem, und ich habe es geschafft, es mit einem einfachen Test zu reproduzieren. Ich hoffe, dass Sie mir helfen können.Sockel Timeout nach zwei Minuten, obwohl auf mehr als zwei Minuten
Lassen Sie mich erklären, ich sende Nachrichten mit Sockets. Alles funktioniert gut, solange ich so_timeout auf weniger als zwei Minuten eingestellt habe. Aber wenn ich es auf mehr als zwei Minuten setze, ist der Sockel nach zwei Minuten abgelaufen. Also, wenn ich so_timeout auf 10 Sekunden setze, wird der Socket nach 10 Sekunden beendet, aber wenn ich ihn auf 180 Sekunden setze, wird der Socket nach 120 Sekunden beendet.
Hier ist ein Testfall:
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();
}
}
Sie sollten die TestSocket1 Klasse und dann TestSocket2 laufen.
Ich kämpfe mit diesem Problem für eine lange Zeit und jede Hilfe wird geschätzt. Vielen Dank.
- EDIT
So entfernte ich die Abhängigkeit von SO_TimeOut und nahm @ Nick Vorschlag in this post den verfügbaren Eingangsstrom zu überprüfen, bevor es zu lesen. Aber jetzt ist das Problem, dass die verfügbaren Bytes nach zwei Minuten immer 0 zurückgeben, obwohl die Eingabe in den Stream geschrieben wurde. Also habe ich immer noch das selbe Problem.
Ich habe Ihren Code auf meinem Laptop getestet (OS X 10.8.4, JDK 1.6.0_37) und die 'TimeoutException' wird wie erwartet nach 180 Minuten ausgelöst. Können Sie Ihre Betriebssystemversion und JDK-Version angeben? – ericson
Betriebssystem Windows7 Ultimate SP1 64Bit, JDK jdk1.6.0_26. Übrigens, wenn Sie nicht auf zwei Minuten beschränkt sind, sollten Sie die TimeoutException nicht sehen. Beachten Sie, dass der Ruhezustand für 2,5 Minuten und der SoTimeOut auf 3 Minuten eingestellt ist, so dass Sie die Nachricht "Hallo Zurück" sehen sollten. – Rotem
Entschuldigung, ich habe vergessen zu erwähnen, dass ich die Ruhezeit auf 25 Minuten erhöht habe, um die 'TimeoutException' zu reproduzieren. Ich bin nicht vertraut mit Windows-Plattform, hoffe, jemand anderes würde helfen. – ericson