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 ... }
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.