Frage

    

Diese Frage bereits eine Antwort hier:

         

Wie erkennen Sie, wenn Socket#close() hat auf einem Sockel auf der Remote-Seite aufgerufen wurde?

War es hilfreich?

Lösung

Die isConnected Methode wird nicht helfen, kehrt es true auch wenn die Remote-Seite die Socket geschlossen hat. Versuchen Sie folgendes:

public class MyServer {
    public static final int PORT = 12345;
    public static void main(String[] args) throws IOException, InterruptedException {
        ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT);
        Socket s = ss.accept();
        Thread.sleep(5000);
        ss.close();
        s.close();
    }
}

public class MyClient {
    public static void main(String[] args) throws IOException, InterruptedException {
        Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT);
        System.out.println(" connected: " + s.isConnected());
        Thread.sleep(10000);
        System.out.println(" connected: " + s.isConnected());
    }
}

Starten Sie den Server, den Client starten. Sie werden sehen, dass es druckt „verbunden: true“. zweimal, obwohl die Buchse zum zweiten Mal geschlossen wird,

Der einzige Weg, wirklich herauszufinden, ist durch das Lesen (Sie erhalten -1 als Rückgabewert) oder schriftlich (eine IOException (Rohrbruch) wird geworfen werden) auf dem zugehörigen Input / OutputStreams.

Andere Tipps

Da die Antworten abweichen ich beschlossen, diese zu prüfen und das Ergebnis zu veröffentlichen -. Einschließlich Testbeispiel

Der Server hier nur schreibt Daten an einen Client und erwartet keine Eingabe.

Der Server:

ServerSocket serverSocket = new ServerSocket(4444);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
while (true) {
  out.println("output");
  if (out.checkError()) System.out.println("ERROR writing data to socket !!!");
  System.out.println(clientSocket.isConnected());
  System.out.println(clientSocket.getInputStream().read());
        // thread sleep ...
  // break condition , close sockets and the like ...
}
  • clientSocket.isConnected () gibt immer wahr, wenn der Client eine Verbindung herstellt (und auch nach dem Disconnect) seltsam !!
  • getInputStream (). () Gelesen
    • macht den Thread für die Eingabe warten, solange der Client verbunden ist und deshalb macht Ihr Programm nichts tun - außer wenn Sie eine Eingabe
    • erhalten
    • -1 zurück, wenn der Client getrennt
  • out.checkError () wahr ist, sobald der Client so getrennt Ich empfehle dieses

Sie können auch Socket-Ausgangsstrom Fehler überprüfen, während auf Client-Socket zu schreiben.

out.println(output);
if(out.checkError())
{
    throw new Exception("Error transmitting data.");
}

Das Verfahren Socket.Available wird sofort eine Socket auslösen, wenn das Remote-System abgeklemmt / die Verbindung geschlossen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top