2013-06-09 4 views
5

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.

+0

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

+0

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

+0

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

Antwort

0

So habe ich herausgefunden, was das Problem der

socket.shutdownInput(); 

Ursache der Steckdose sollte sich ändern somit FIN_WAIT Zustand 2 Minuten warten vor dem Schließen (2MSL)

+0

FIN_WAIT_1 verursacht kein Zeitlimit. – EJP

+1

Ich glaube nicht, dass Sie meine Antwort verstehen. Dies war das Problem und ich habe einen Testfall, um es zu beweisen, so dass es jenseits meines Verständnisses ist, warum du - ich. – Rotem

1

Sie können das Verbindungszeitlimit nicht über die Plattformvorgabe hinaus erhöhen, was etwa einer Minute entspricht. Sie können es nur verringern. Der Versuch, es zu erhöhen, macht keinen Sinn. Was versuchst du zu erreichen?

+0

Ok, zuerst konnte ich keine Informationen über den Standard finden Socket Timeout in Windows Ich würde mich freuen, wenn Sie einen Link hinzufügen können.Zweitens wird der setSoTimeout-Dokumentationsstatus _A timeout of zero als unendliches timeout_ interpretiert. Wie könnte ich also wissen, dass es auf den Standard der Plattform beschränkt ist (ich konnte wiederum keine Informationen darüber finden)? Drittens versuche ich, einen Fehler in einem alten System zu beheben, der das Senden von Nachrichten zwischen Sockets erlaubt, die mehr als zwei Minuten dauern können. – Rotem

+0

Der Javadoc ist offensichtlich falsch über die Verbindung Timeout, eine seltene Gelegenheit. Wenn Sie es überhaupt nicht setzen oder auf Null setzen, erhalten Sie unter den entsprechenden Umständen definitiv ein Verbindungstimeout. Ihr Kommentar bezieht sich jedoch auf das * Lese * Timeout, was eine andere Sache ist. Sie können ein Lese-Timeout auf alles einstellen, was Sie möchten. Ich habe nie ein Problem damit gesehen, und ich benutze Windows Socket Lese-Timeouts regelmäßig. – EJP

+0

Der Javadocs bezieht sich auf die ** Lese ** Zeitüberschreitung. Wenn Sie nie ein Problem mit Windows-Sockets-Lese-Timeout hatten, würde ich mich freuen, wenn Sie den Testfall ausführen und selbst überprüfen können. Vielen Dank. – Rotem

Verwandte Themen