Jak wykryć zamknięcie zdalnego gniazda bocznego? [duplikat]

To pytanie ma już odpowiedź tutaj:

Jak wykryć, czy Socket#close() zostało wywołane NA gniazdku po stronie zdalnej?

Author: Duncan Jones, 2008-09-30

4 answers

Metoda isConnected nie pomoże, zwróci {[2] } nawet jeśli zdalna strona zamknęła Gniazdo. Spróbuj tego:

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());
    }
}

Uruchom serwer, uruchom klienta. Zobaczysz, że drukuje "connected: true" dwa razy, nawet jeśli gniazdo jest zamknięte za drugim razem.

Jedynym sposobem, aby się dowiedzieć, jest odczytanie (otrzymasz -1 jako wartość zwracaną) lub zapisanie (IOException (zepsuta rura) zostanie wyrzucona) na powiązane strumienie wejściowe/wyjściowe.

 59
Author: WMR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 07:06:20

Ponieważ odpowiedzi odbiegają, postanowiłem to przetestować i opublikować wynik-w tym Przykład testu.

Serwer zapisuje dane do klienta i nie oczekuje żadnych danych wejściowych.

Serwer:

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 () zwraca zawsze true, gdy klient się połączy (a nawet po rozłączeniu).!
  • getInputStream ().Czytaj()
    • sprawia, że wątek czeka na wejście tak długo, jak klient jest podłączony, a tym samym sprawia, że program nie rób nic-chyba, że dostaniesz jakieś Wejście
    • zwraca -1 jeśli klient się rozłączył
  • Wynocha.checkError () jest prawdziwe, gdy tylko klient jest odłączony, więc polecam to
 25
Author: Thorsten Niehues,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-30 12:56:38

Można również sprawdzić błąd strumienia wyjściowego gniazda podczas zapisu do gniazda klienta.

out.println(output);
if(out.checkError())
{
    throw new Exception("Error transmitting data.");
}
 13
Author: Sangamesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 13:07:43

Metoda Socket.Dostępny natychmiast rzuci SocketException, jeśli zdalny system odłączył / zamknął połączenie.

 -8
Author: DumbestGuyOnSaturn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 21:42:39