2009-03-23 18 views
0

Je crée un prototype de serveur client & afin que je puisse comprendre comment gérer les reconnexions. Le serveur doit créer une socket de serveur et écouter pour toujours. Un client peut se connecter, envoyer ses données, et fermer son socket, mais il n'enverra pas de message de type "I'm done and closing" au serveur. Pour cette raison, le serveur obtient un EOFException lorsqu'il exécute un readByte() depuis la fermeture du client distant. Dans le gestionnaire d'erreurs pour le EOFException, il fermera le socket et en ouvrira un nouveau.Java: la reconnexion sur un socket donne parfois une erreur

Voici le problème: Le client obtient parfois un SocketWriteError quand il fait l'appel outputStream.write() même après son ouverture avec succès la prise/inputstream/outpustream. Cela peut avoir quelque chose à voir avec la fréquence d'ouverture et de fermeture de ces sockets. Une chose intéressante est que le client fait un nombre arbitraire d'écritures/ferme/reconnecte avant de se séparer. Il va parfois conner sur la première reconnexion, d'autres fois il faudra 50 reconnecter avant de voir le SocketWriteError.

est ici l'erreur sur le côté client:

 
java.net.SocketException: Connection reset by peer: socket write error 
     at java.net.SocketOutputStream.socketWrite0(Native Method) 
     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
     at java.net.SocketOutputStream.write(SocketOutputStream.java:115) 
     at bytebuffertest.Client.main(Client.java:37) 

Voici quelques extraits de code:

SERVEUR:

public static void main(String[] args) 
{ 
    Server x = new Server(); 
    x.initialize(); 
} 

private void initialize() 
{ 
    ServerSocket s; 
    InputStream is; 
    DataInputStream dis; 
    while (true) //ADDED THIS!!!!!!!!!!!!!!!!!!!!!! 
    { 
     try 
     { 
      s = new ServerSocket(4448); 
      s.setSoTimeout(0); 
      s.setReuseAddress(true); 
      is = s.accept().getInputStream(); 
      System.out.println("accepted client"); 
      dis = new DataInputStream(is); 
      try 
      { 

       byte input = dis.readByte(); 
       System.out.println("read: " + input); 
      } catch (Exception ex) 
      { 
       System.out.println("Exception"); 
       dis.close(); 
       is.close(); 
       s.close(); 
      } 
     } catch (IOException ex) 
     { 
      System.out.println("ioexception"); 
     } 
    } 
} 

CLIENT:

public static void main(String[] args) 
{ 
    Socket s; 
    OutputStream os; 
    try 
    { 
     s = new Socket("localhost", 4448); 
     s.setKeepAlive(true); 
     s.setReuseAddress(true); 
     os = s.getOutputStream(); 
     int counter = 0; 
     while (true) 
     { 
      try 
      { 
       os.write((byte) counter++); 
       os.flush(); 

       os.close(); 
       s.close(); 

       s = new Socket("localhost", 4448); 
       s.setKeepAlive(true); 
       s.setReuseAddress(true); 
       os = s.getOutputStream(); 
      } catch (Exception e) 
      { 
       e.printStackTrace(); 
       System.err.println("ERROR: reconnecting..."); 
      } 
     } 
    } catch (Exception ex) 
    { 
     ex.printStackTrace(); 
     System.err.println("ERROR: could not connect"); 
    } 
} 

Est-ce que quelqu'un savoir comment correctement reconnecter?

Répondre

3

Ne fermez pas le ServerSocket sur une erreur, juste .accept() une nouvelle connexion. Ce que je fais normalement est chaque fois que ServerSocket.accept() retourne un socket, je génère un thread pour gérer l'envoi et la réception de ce socket. De cette façon, vous êtes prêt à accepter une nouvelle connexion dès que quelqu'un veut vous connecter.

+0

Oui, je crois que c'est la réponse. Je vous remercie! – jbu