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?
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.
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
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.");
}
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.
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