Problème communication SOCKET Réseau TCP/IP

Problème communication SOCKET Réseau TCP/IP - Java - Programmation

Marsh Posté le 09-09-2010 à 17:48:02    

Bonjour,
Je rencontre un problème aléatoire de communication entre un client et un serveur utilisant des sockets via le protocole TCP/IP en JAVA.
 
Le serveur d’écoute est multithread. Il écoute sur un port 8090 par exemple
Lorsqu’un client essaye de se connecter, il accepte la connexion et créé un thread de récupérer les informations de connexion.
 
Exemple de code utilisé pour l’écoute et l’acceptation du client :

Code :
  1. ServerSocket ss = new ServerSocket(port);
  2. while (true)
  3. {
  4. new CommunicationDaemonThread(ss.accept());
  5. }


 
La classe CommunicationDaemonThread correspond à ce thread dans lequel le flux d’entrée et de sortie du nouveau client sont définis :
 

Code :
  1. ObjectInputStream fluxIn=new ObjectInputStream(maSocket.getInputStream());
  2. ObjectOutputStream fluxOut=new ObjectOutputStream(maSocket.getOutputStream());


 
Ces flux sont stockés dans une table sur le serveur afin de pouvoir dialoguer ultérieurement avec le client.
 
La connexion client/serveur doit être permanente.  
Le client doit rester connecté en permanence au serveur.  En cas de déconnexion du client, le serveur supprime l’entrée du client dans sa table, ferme les flux de communication et la socket dédiée avec ce client.
 
Le client doit répondre à chaque demande que le serveur pourrait lui envoyer : les rôles inversés sont obligatoires par rapport à un fonctionnement client/serveur classique.
 
Requête vers un client côté serveur :
A un instant T, le serveur demande une information à un client :
Pour cela, il récupère le flux de sortie depuis sa table, puis il envoie un objet (ou des données) via le réseau :  
 

Code :
  1. ObjectOutputStream fluxOut=daemon.getObjectOS();
  2. fluxOut.writeObject(objectToSend);
  3. fluxOut.flush();


 
 
 
Le client lui attend cette demande du serveur avec le code suivant :
 

Code :
  1. ObjectInputStream fluxIn = new ObjectInputStream(sock.getInputStream());
  2. ExchangeMessage message=(ExchangeMessage)fluxIn.readObject();
  3. if (message!=null) { // traitement du message }
  4. else                { // traitement de l'erreur    }


 
A noter que le client est bloqué sur le readObject()tant qu’il n’a pas reçu une demande du serveur. (ce qui est normal)
En cas d’exception sur un de ces traitements, la connexion avec le client est supprimée.
 
Problème :
Tout fonctionne cependant, dans de très rares cas (ou sur certains ordinateurs - je n'arrive pas à déterminer la cause) la requête part bien du serveur mais n’arrive jamais  jusqu’au client  
 
Les commandes writeObject() et flush() côté serveur sont correctement exécutées mais le client ne reçoit pas les données.  (bloqué sur le readObject())
 
La socket ne retourne pas de message d’erreur et semble toujours active et fonctionnelle pour le serveur. Mais le client ne reçoit plus aucun message.
 
Dans ce cas, pour s’en sortir, il faut que le client se déconnecte totalement du serveur puis qu’il se reconnecte : création d’une nouvelle socket.
 
 
Ce mode de fonctionnement est-il dû à un mauvais paramétrage des sockets de ma part ?
 
Pourquoi java ne renvoie pas un statut correct de l’état des sockets ? (socket.isClosed() - socket.isConnected()).
 
Pourquoi est-ce que pour java, la socket semble toujours active entre le client et le serveur mais qu’elle se trouver dans un état non défini ?  
 
Avez-vous déjà rencontré ce problème ?  
Une solution pour le résoudre ?
 
Merci d'avance pour votre aide

Reply

Marsh Posté le 09-09-2010 à 17:48:02   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed