IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Problème communication SOCKET Réseau TCP/IP


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut Problème communication SOCKET Réseau TCP/IP
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ServerSocket ss = new ServerSocket(port);
    while (true)
    {
    new CommunicationDaemonThread(ss.accept());
    }
    La classe CommunicationDaemonThread correspond à ce thread dans lequel le flux d’entrée et de sortie du nouveau client sont définis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ObjectInputStream fluxIn=new ObjectInputStream(maSocket.getInputStream());
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ObjectOutputStream fluxOut=daemon.getObjectOS();
    fluxOut.writeObject(objectToSend);
    fluxOut.flush();


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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ObjectInputStream fluxIn = new ObjectInputStream(sock.getInputStream());
    ExchangeMessage message=(ExchangeMessage)fluxIn.readObject();
    if (message!=null) { // traitement du message }
    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

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    cela se produit-il après la connection ou après que la connexion soit restée inactive un certains temps? Dans le dernier cas, regarder à activer le keepalive sur la connexion, pour que l'OS ne les coupe pas abruptement. Java donne l'information sur la socket que lui fournis l'OS.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut
    Merci pour votre réponse.
    J'avais déjà exploré la piste du keepAlive. Il est déjà présent lors de la création de la socket côté serveur et côté client.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maSocket.setKeepAlive(true);
    Cependant, ca n'a aucun effet sur mon problème. J'ai cru lire (je ne sais plus ou que le keep alive permet de maintenir une connexion au delà de 2h (ou une valeur propre à chaque OS) si jamais il y n'y a eu aucun échange via la socket.

    Au passage, y a t-il un moyen de changer l'intervalle de temps par défaut du keep alive ?

    Dans mon cas, le problème s'est manifesté au bout de quelques minutes d'inactivité sur un poste (xp) alors qu'il ne se manifeste pas sur un autre poste (lui aussi en xp).

    Je deviens dingue avec ça

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le keepalive envoie régulièrement des packets TCP/IP vide pour maintenir la connection en vide. De plus si tu teste entre deux machines et que t'as des problème alors qu'il n'y a ni NAt ni firewall entre ces machine, le problème peux être autre. Par exemple une soupe dans ton code au niveau de la gestion multi thread

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Par défaut
    Salam,

    Essayez de voir une autre façon de communiquer, exemple utiliser la communication en Heart beat, e.g. une connexion par pulsation chaque 5 mn.

    Enfin, cela ne fait que contourner le problème.

    Bon courage.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut
    J'ai modifié mon programme afin que le client envoie une sorte de ping vers le serveur de façon régulière.
    J'ai plus qu'à essayer chez le client chez qui ca ne marchait pas ...

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2010, 18h53
  2. [C#] Prog. Réseau: Problème de socket client
    Par keyser-soze dans le forum C#
    Réponses: 4
    Dernier message: 26/09/2007, 18h12
  3. Problème de communication socket (Client->Server)
    Par Julien_C++ dans le forum C++Builder
    Réponses: 6
    Dernier message: 21/05/2007, 21h28
  4. Problème communication sockets serveur mutli-client
    Par muad'dib dans le forum Réseau
    Réponses: 5
    Dernier message: 17/05/2007, 02h21
  5. Réponses: 5
    Dernier message: 29/03/2007, 22h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo