Wie eine Remote-Seite Steckdose in der Nähe erkennen? [Duplikat]
-
02-07-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
Wie erkennen Sie, wenn Socket#close()
hat auf einem Sockel auf der Remote-Seite aufgerufen wurde?
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.