Comment détecter une prise latérale distante?

Comment détecter si Socket#close() a été appelé sur un socket du côté distant?

La méthode isConnected ne va pas aider, elle retournera true même si le côté distant a fermé le socket. Essaye ça:

 public class MyServer { public static final int PORT = 12345; public static void main(Ssortingng[] 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(Ssortingng[] 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()); } } 

Démarrez le serveur, démarrez le client. Vous verrez qu’il imprime “connected: true” deux fois, même si le socket est fermé la deuxième fois.

La seule façon de le savoir est de lire (vous obtiendrez -1 comme valeur de retour) ou d’écrire (une IOException (tuyau cassé) sera lancée) sur les Input / OutputStream associés.

Comme les réponses diffèrent, j’ai décidé de tester et d’afficher le résultat, y compris l’exemple de test.

Le serveur écrit simplement des données sur un client et n’attend aucune entrée.

Le serveur:

 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 () retourne toujours vrai une fois que le client se connecte (et même après la déconnexion) bizarre !!
  • getInputStream (). read ()
    • fait en sorte que le thread attende la saisie tant que le client est connecté et par conséquent, ne fait rien de votre programme – sauf si vous obtenez des entrées
    • renvoie -1 si le client est déconnecté
  • out.checkError () est vrai dès que le client est déconnecté, alors je vous le recommande

Vous pouvez également rechercher une erreur de stream de sortie de socket lors de l’écriture sur le socket client.

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

La méthode Socket.Available lancera immédiatement une exception SocketException si le système distant a déconnecté / fermé la connexion.