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

Entrée/Sortie Java Discussion :

[Socket&Stream] Plusieurs streams sur une même socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut [Socket&Stream] Plusieurs streams sur une même socket
    Bonjour

    Je suis actuellement sur le développement d'un client/serveur, et j'aimerais pouvoir facilement transmettre, via des (SSL)Socket, aussi bien du texte pour mon protocole que des Objects pour le transfert de données.

    Malheureusement je suis confronté à un problème qui ne génère pas d'exception mais bloque simplement mon programme.

    Lors de la création d'une socket "client" suite à un accept(), je lance le constructeur de ma classe ServeurThread qui fait (entre autres) ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        try {
          // affectation des flux d'E/S du client
          // pour les bytes
          m_toClientBytes = m_client.getOutputStream();
          m_fromClientBytes = m_client.getInputStream();
          // pour les Objects
          m_toClientObj = new ObjectOutputStream(m_toClientBytes);
          m_fromClientObj = new ObjectInputStream(m_fromClientBytes);
          // pour le texte
          m_toClientTxt = new PrintWriter(m_toClientBytes);
          m_fromClientTxt = new BufferedReader(new InputStreamReader(
                  m_fromClientBytes));
          // on "transforme" cette instance en thread puis on le lance
          m_monThread = new Thread(this);
          m_monThread.start();
        } catch (IOException e) {
          m_others.fatal("Erreur d'affectation des flux d'E/S" + e);
          m_papa.delClient();
          e.printStackTrace();
        }
    et mon code se bloque alors sur la création de l'ObjectInputStream. Après une attente de quelques minutes pour être sûr je coupe mon client et j'ai donc logiquement un exception levée avec "java.net.SocketException: Connection reset".
    A savoir que si je commente les lignes ObjectInput/Output, le programme fonctionne correctement (pour l'envoi/réception de texte évidemment).


    Ma question est donc, pourquoi ça bloque ?

    Ensuite il est fort probable (enfin j'imagine) que l'affectation de plusieurs flux de différents types ne soit pas spécialement "propre", je suis donc totalement ouvert à toute proposition quand à la conception d'un tel serveur, celui-ci devant être capable d'envoyer/recevoir des String pour mon protocole et quelques informations, mais aussi de pouvoir envoyer/recevoir des Objets.

  2. #2
    Membre du Club

    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 64
    Points
    64
    Par défaut hello
    Et si au lieu de commenter ta partie m_toClientObj et m_fromClientObj tu commentes plutôt m_toClientTxt et m_fromClientTxt est-ce que ton programme continue à bloquer ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    oui, ça bloque dans ce cas là

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Bon vu le manque de réponse j'essayes différentes techniques, par exemple une class Message qui contient un Object, celui-ci pouvant être un String ou les Objects que je dois transporter, ainsi je peux n'utiliser que les ObjectI/OStream, mais la fonctions readObject() n'est pas bloquante comme le readLine() d'un BufferedReader, et j'ai donc des EOFExceptions (normal ...)

    Auriez-vous des idées de conception pour arranger mon soucis ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Bon, j'ai une bonne nouvelle (pour moi :p), j'ai la solution

    Je vais donc bien utiliser une classe Message qui pourra prendre différentes forme, et passer uniquement par des Object IO Streams, car il est fortement déconseillé d'utiliser plusieurs types de flux sur une même socket.

    Ensuite, si mon programme bloquait, c'est à cause d'une subtilité sur ces fameux Object IO Streams. Certains l'ont reporté comme un bug : http://bugs.sun.com/bugdatabase/view...bug_id=4026188

    Mais il semblerait que ce soit "normale" ... bref il faut toujours "flusher" l'ObjectOutputStream après sa création afin que l'ObjectInputStream de l'autre coté de la socket reçoive un header nécessaire à son initialisation.

    ------------ exemple ------------
    Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());
    oos.flush();
    ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());
    Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ObjectOutputStream oos = new ObjectOutputStream(clientSock.getOutputStream());
    oos.flush();
    ObjectInputStream ois = new ObjectInputStream(clientSock.getInputStream());

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire plusieurs vidéos sur une même form en même temps
    Par kurul1 dans le forum C++Builder
    Réponses: 33
    Dernier message: 21/04/2008, 09h04
  2. [JpGraph] Plusieurs graphes sur une même page
    Par Dam1en dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/12/2007, 23h13
  3. Plusieurs applications sur une même base de données
    Par ellene dans le forum Hibernate
    Réponses: 8
    Dernier message: 13/11/2007, 10h04
  4. Affichage de plusieurs graphiques sur une même form
    Par redpulse dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/02/2007, 08h41
  5. [C#][SVG] Combinaison de plusieurs graphe sur une même page
    Par doudoustephane dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/11/2006, 09h19

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