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

Format d'échange (XML, JSON...) Java Discussion :

Fermeture de Socket apres parsage XML [DOM]


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut Fermeture de Socket apres parsage XML
    Bonjour.

    A savoir: Le client et le serveur marchent tres bien, ce n'est qu'apres parsage que les choses se compliquent...!

    Mise en situation:
    Une communication Client/Serveur via socket.
    Le client envoi une "String" XML.
    Coté serveur je parse le document XML reçu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DocumentBuilderFactory maFactory = new DocumentBuilderFactoryImpl();
    DocumentBuilder monBuilder = maFactory.newDocumentBuilder();
    Document monDocument = monBuilder.parse(maSocket.getInputStream());
    Le parsage se deroule tres bien, je peux recuperer des informations dans ma "string" (mon document XML).
    Le seul probleme c'est que apres ma socket se ferme pour une raison inconnue! Alors, pourquoi la socket se ferme alors que l'InputStream et la socket n'ont rien à voir ?!

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DocumentBuilderFactory maFactory = new DocumentBuilderFactoryImpl();
    DocumentBuilder monBuilder = maFactory.newDocumentBuilder();
    System.out.println( "Closed ? "+masocket.isClosed());
    Document monDocument = monBuilder.parse(maSocket.getInputStream());
    System.out.println( "Closed ? "+masocket.isClosed());
    > Closed ? false
    > Closed ? true


    et si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DocumentBuilderFactory maFactory = new DocumentBuilderFactoryImpl();
    DocumentBuilder monBuilder = maFactory.newDocumentBuilder();
    System.out.println( "Closed ? "+masocket.isClosed());
    Document monDocument = null; //monBuilder.parse(maSocket.getInputStream());
    System.out.println( "Closed ? "+masocket.isClosed());
    > Closed ? false
    > Closed ? false


    Visiblement la methode parse de la classe DocumentBuilder ferme effectivement la socket.
    Alors voici mes questions :

    Que faire pour garder ma socket ouverte ?

    Solution par clonage (Super lourd !!!)?
    Un clonage est-il obligatoire pour pouvoir dupliquer mon InputStream ?
    Note : La creation d'un autre InputStream ne fait qu'une duplication par adresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private InputStream iStream = null;
    ...
    iStream = socket.getInputStream();
    Document monDocument = monBuilder.parse(maSocket.getInputStream());
    Donc heu... ça non plus ça marche pas.
    Voila j'espere que j'ai été assez clair et que la solution de ce probleme aidera nombre d'entre nous !

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Et bien alors... Personne n'a rencontré ce cas de figure ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Bon ben les gars je suis un peu deçu, pas de reponses...

    Voila ce que j'ai trouvé qui peut faire l'affaire :
    La méthode parse ferme le socket ?! Qu'il en soit ainsi, je créée une classe tampon qui redéfinie la methode close :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class NoCloseInputStream extends FilterInputStream {
        public NoCloseInputStream(InputStream in) {
            super(in);
        }
     
        public void close() {} // ignore close
    }
    Et donc j'instancie mon objet NoCloseInputStream et je passe en parametre de la methode parse, mon objet "tampon" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    NoCloseInputStream noCloseInput = new NoCloseInputStream(maSocket.getInputStream);
     
    DocumentBuilderFactory maFactory = new DocumentBuilderFactoryImpl();
    DocumentBuilder monBuilder = maFactory.newDocumentBuilder();
    System.out.println( "Closed ? "+masocket.isClosed());
    Document monDocument = monBuilder.parse(noCloseInput);
    System.out.println( "Closed ? "+masocket.isClosed());
    > Closed ? false
    > Closed ? false


    Je n'ai rien inventé tout se trouve ici

    Et donc nouvelle question : N'y a-t-il pas quelque chose de plus élégant ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Puisque je suis lancé dans mon monologue, je vais mettre la dernière solution que j'ai trouvé.

    Je récupère mon InputStream et le place dans un BufferedReader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BufferedReader _reader = null;
    ...
     
    _reader = new BufferedReader ( new OutputStreamReader(_masocket.getInputStream()));
    ...
    Apres je créé mon InputStream "tampon" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    InputStream myInput = new ByteArrayInputStream(_reader.readLine().getBytes());
     
    DocumentBuilderFactory maFactory = new DocumentBuilderFactoryImpl();
    DocumentBuilder monBuilder = maFactory.newDocumentBuilder();
    System.out.println( "Closed ? "+masocket.isClosed());
    Document monDocument = monBuilder.parse(myInput);
    System.out.println( "Closed ? "+masocket.isClosed());
    > Closed ? false
    > Closed ? false


    Voila. En plus avec cette maniere de faire, on peut parser chaque "message" indépendament avec la méthode readLine() de la classe BufferedReader.

    Si vous avez une solution plus élégante je suis à votre écoute.
    En tout cas, merci les gars pour le coup de main.

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

Discussions similaires

  1. fermeture de socket
    Par youp_db dans le forum Réseau
    Réponses: 2
    Dernier message: 15/09/2006, 16h23
  2. Fermeture de socket me pose problème !
    Par MonsieurAk dans le forum Réseau
    Réponses: 2
    Dernier message: 15/05/2006, 23h03
  3. [DOM] Parsage XML en PHP 4
    Par Huntress dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 07/12/2005, 22h24
  4. [DOM] Problème de suppression sauts de lignes après modification XML
    Par chabada dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 15/06/2005, 13h46
  5. [Linux] Probleme de fermeture de Sockets
    Par diefo dans le forum Réseau
    Réponses: 6
    Dernier message: 30/12/2003, 13h10

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