2009-07-20 7 views
3

Si je tue le processus Socket Server, mon processus client Socket ne reçoit pas d'erreurs, il continue à boucler indéfiniment sur le code suivant:java, client detect serveur est décédé

public void run() { 
    while(readData) { 
     String inputLine = null; 
     try { 
     while((inputLine = m_inputStream.readLine()) != null) { 
      //do stuff 
     } 
     } catch (IOException e) { 
     readData = false; 
    } 
    } 
} 

Comment puis-je détecter que le serveur de socket est parti et terminer la boucle?

Répondre

4

Mettre fin à la boucle externe lorsque l'appel à readLine() renvoie null.

Aucune exception n'est levée lorsque le serveur ferme normalement la connexion. Le flux doit renvoyer null pour signaler la fin des données.

Cela peut être fait avec une boucle comme ceci:

public void run() { 
    try { 
    while (true) { 
     String line = input.readLine(); 
     if (line == null) 
     break; 
     /* Process line. */ 
     ... 
    } 
    } catch (IOException ex) { 
    /* Handle the exception as desired. */ 
    ex.printStackTrace(); 
    } 
} 
+0

Donc le flux retournera NULL SEULEMENT si la connexion est fermée? – anio

+2

Oui - sinon l'appel à la lecture bloquera jusqu'à ce qu'il y ait des données à lire –

+1

La déclaration de m_inputStream n'est pas montrée, mais je suppose qu'il s'agit d'un java.io.BufferedReader. Si c'est le cas, il ne retournera que null si le socket est fermé. Si le serveur est tué brutalement, une "réinitialisation" devrait se produire au niveau TCP, ce qui entraînera une exception soulevée par Java Socket. – erickson

0

Alors que la réponse de erickson est correcte, vous avez essayé de placer le socket read time-out properties? (par exemple sun.net.client.defaultReadTimeout). S'il est possible que le serveur réponde longuement, cela peut être moins utile en tant que solution à votre problème, mais c'est néanmoins une bonne idée dans de nombreux cas.