86 votes

Comment détecter une prise de distance côté proches ?

Comment vous détecter si `` a été appelée sur une prise sur le côté distant ?

65voto

WMR Points 5869

L' isConnected méthode ne va pas aider, il sera de retour true , même si le côté distant a fermé la prise. Essayez ceci:

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

Démarrer le serveur, démarrez le client. Vous verrez qu'il affiche "connecté: true" deux fois, même si la socket est fermée la deuxième fois.

La seule façon de vraiment savoir est en lisant (vous obtiendrez -1 comme valeur de retour) ou d'écriture ( IOException (broken pipe) sera lancé) sur l'Entrée/OutputStreams.

29voto

Thorsten Niehues Points 1167

Puisque les réponses dévier j'ai décidé de tester ceci et poste le résultat - dont l'exemple de test.

Le serveur ici juste écrit des données sur un client et ne vous attendez pas à une 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() renvoie toujours true une fois que le client se connecte (et même après la déconnexion) bizarre !!
  • getInputStream().lire()
    • rend le fil d'attente pour l'entrée, tant que le client est connecté et permet donc de votre programme de ne pas faire quoi que ce soit - sauf si vous obtenez une entrée
    • retourne -1 si le client déconnecté
  • .checkError() est vrai dès lors que le client est déconnecté, donc je vous le recommande

13voto

Sangamesh Points 109

Vous pouvez également vérifier pour erreur de flux de sortie prise tout en écrivant pour le socket client.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X