[java] envoie de fichier XML entre 2 clients

envoie de fichier XML entre 2 clients [java] - Java - Programmation

Marsh Posté le 01-02-2004 à 12:17:00    

Bonjour !
 
Je fais un messenger en java. Je voudrais que le dialogue entre 2 clients, se fasse par l'envoie de fichier XML.
 
Comment puis je faire pour envoyer des fichiers XML ?
 
Pour le moment, j'ouvre le fichier, et le transmet byte a byte.
Mais mon BufferedOutputStream, quand je le ferme apres l'envoie, ferme ma socket de connection entre les clients. Je ne peux donc envoyer qu'un seul fichier, alors que je voudrais établir un dialogue.
 
Si vous avez un autre moyen pour envoyer ce fichier ...
merci :-)

Reply

Marsh Posté le 01-02-2004 à 12:17:00   

Reply

Marsh Posté le 01-02-2004 à 17:49:42    

euh que ça soit de l'xml ou autre n'a rien à voir.
que ça soit un fichier ou pas non plus.
 
(juste pour te permettre de préciser tes recherches)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 01-02-2004 à 18:19:43    

pkoi tu fermes l'outputstream ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 01-02-2004 à 18:36:59    

benou a écrit :

pkoi tu fermes l'outputstream ?


 
si je ne le ferme pas, l'autre ne reçoit rien

Reply

Marsh Posté le 01-02-2004 à 18:38:26    

the real moins moins a écrit :

euh  
que ça soit un fichier ou pas non plus.
 


 
c'est un fichier que je veux envoyer ...
alors pkoi ça a rien a voir ?

Reply

Marsh Posté le 01-02-2004 à 18:48:03    

vinz13 a écrit :


 
c'est un fichier que je veux envoyer ...
alors pkoi ça a rien a voir ?

bah d'une part je vois pas pq tu passerais par le systeme de fichier pour echanger tes messages xml, mais c'est pas ça le probleme... le truc c'est qu'un fileinput/output stream est un flux comme un autre


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 01-02-2004 à 18:58:05    

vinz13 a écrit :


si je ne le ferme pas, l'autre ne reçoit rien


 :heink:  
 
t'as essayé un flush ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 02-02-2004 à 14:37:20    

the real moins moins a écrit :

bah d'une part je vois pas pq tu passerais par le systeme de fichier pour echanger tes messages xml, mais c'est pas ça le probleme... le truc c'est qu'un fileinput/output stream est un flux comme un autre


 
comment faire alors ?

Reply

Marsh Posté le 02-02-2004 à 14:37:43    

benou a écrit :


 :heink:  
 
t'as essayé un flush ?


 
oui

Reply

Marsh Posté le 02-02-2004 à 14:38:28    

totoze

Reply

Marsh Posté le 02-02-2004 à 14:38:28   

Reply

Marsh Posté le 02-02-2004 à 15:49:33    


ben c'est surement que tu lis mal les données sur ton inputstream de la socket. Montre ton code d'écoute


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 03-02-2004 à 14:35:45    

Utilise la serialisation !
Avec des ObjectInputStream, ca passe tout seul.

Reply

Marsh Posté le 03-02-2004 à 14:44:36    

Sujet :  [java] envoie de fichier XML  
 

Code :
  1. throw myXMLFile;


 
 
(dsl)

Reply

Marsh Posté le 03-02-2004 à 14:52:31    

Oh c'est bon
 
:D

Reply

Marsh Posté le 03-02-2004 à 15:11:18    

bartleby a écrit :

Utilise la serialisation !
Avec des ObjectInputStream, ca passe tout seul.


nan mais il aura le même problème si il écoute mal les données ur le réseau, mais le msr a l'air d'être mort, il répond plus :/


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 03-02-2004 à 16:48:10    

benou a écrit :


nan mais il aura le même problème si il écoute mal les données ur le réseau, mais le msr a l'air d'être mort, il répond plus :/

euh en plus un ObjectIn/OutputStream  pour balancer du texte, riche idée [:zebra33]


Message édité par the real moins moins le 03-02-2004 à 16:48:21

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-02-2004 à 19:15:36    

benou a écrit :


ben c'est surement que tu lis mal les données sur ton inputstream de la socket. Montre ton code d'écoute


 
C'est pas un probleme d'écoute.
Le premier fichier passe sans probleme, mais apres cet envoie, la socket est fermée. Alors je peux pas répondre.
 
d'un coté, je crée un fichier XML, puis j'envoie son contenu.
de l'autre, je recupere le contenu, puis recrée le fichier XML pour le parcourir et extraire le texte et l'emetteur.
 
mais si tu veux mon code d'écoute:
 
while( runner != null ) {
 try {
  File pfile = new File("E:/Divers/projet/Java/" + pseudo +".xml" );
                byte[] buf = new byte[2048];
                int i;
                InputStream in = socket.getInputStream();
                BufferedInputStream bin = new BufferedInputStream(in,2048);
                FileOutputStream fos = new FileOutputStream(pfile);
                while ((i = bin.read(buf,0,2048)) != -1){  
                        fos.write(buf,0,i);
                       }
               bin.close();
               fos.close();
               XMLReader parser= XMLReaderFactory.createXMLReader("org.apache.crimson.parser.XMLReaderImpl" );
               parser.setContentHandler(monHandler);
               parser.parse(new InputSource(new InputStreamReader(new FileInputStream("E:/Divers/projet/Java/" + pseudo +".xml" ),"UTF8" )));
   }
   catch (Exception e) {
   }
  }

Reply

Marsh Posté le 03-02-2004 à 20:06:47    

catch (Exception e) {
   }  
 
AYAN !
 
chrisbk, un client pour toi [:icon7]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-02-2004 à 21:35:49    

[:rofl2]

Reply

Marsh Posté le 03-02-2004 à 21:38:42    

Voyez ? pour se debarasser des messages du compilo a quoi il en est reduit ? :o

Reply

Marsh Posté le 03-02-2004 à 21:39:08    

perso j'aurais fait un catch(Throwable) pour etre sur de rien louper [:aloy]

Reply

Marsh Posté le 03-02-2004 à 21:50:51    

chrisbk a écrit :

Voyez ? pour se debarasser des messages du compilo a quoi il en est reduit ? :o
 


 
bin oui mais bon c'est une erreur de jeunesse :o

Reply

Marsh Posté le 03-02-2004 à 21:54:54    

DarkLord a écrit :


 
bin oui mais bon c'est une erreur de jeunesse :o  


 
voui, certes, on peut faire plus fin comme gestion d'erreurs
 

Reply

Marsh Posté le 03-02-2004 à 23:20:42    

vinz13 a écrit :


C'est pas un probleme d'écoute.


 :pfff:  
Dis pas ca avec une telle certitude, ton code te contredit juste après ...
 

vinz13 a écrit :


                while ((i = bin.read(buf,0,2048)) != -1){  
                        fos.write(buf,0,i);  
                       }  


 
un read() ne retourne -1 que lorsque la fin du stream est atteinte. Dans le cas d'une socket, la fin d'un flux intervient quand il est fermé de l'autre côté.
 
Donc c'est tout à fait normal que ton while boucle jusqu'à se que tu ferme le flux : c'est ce que tu lui demande de faire.
 
Comme je te le disais, il faut que tu mettes en place un protocole réseau.
 
exemple : tu envois d'abord la taille du fichier (xml-length: 1234), un retour à la ligne, puis le fichier.
 
ce qui donne pour le code d'écoute :  

Code :
  1. private static final PROTO_XML_LENGTH = ""xml-length :";
  2. //...
  3.    int b;
  4.    while ((b = in.read()) != -1) {
  5.       // lecture de la longueur
  6.       StringBuffer buf = new StringBuffer(20);
  7.       do {
  8.          buf.append((char) b);
  9.       } while ((b = in.read()) != -1);
  10.       if (b == -1) {
  11.          break;
  12.       }
  13.       String line = buf.toString();
  14.       if (! buf.statsWith(PROTO_XML_LENGTH)) {
  15.           throw new NetworkProtocoleException("unknown command", line);
  16.       }
  17.       String lengthStr = line.substring(PROTO_XML_LENGTH.length);
  18.       int length;
  19.       try {
  20.          length = Integer.parseInt(lengthStr);
  21.       } catch (NumberFormatException e) {
  22.           throw new NetworkProtocoleException("bad xml length format", lengthStr, e);
  23.       }
  24.       // lecture du fichier XML  
  25.       // ici je le fait en un bloc pour simplifier mais il faudrait buffuriser la lecture ...
  26.       byte[] xmlFile = new byte[length];
  27.       int readSize = in.read(xmlFile, 0, length);
  28.       if (readSize  != length) {
  29.           throw new NetworkProtocoleException("incomplete transfert : waiting " + length + ", received " + readSize, e);
  30.       }
  31.       // ensuite tu en fais ce que tu veux de ton XML, et tu laisses boucler : on est prêt pour un nouvel envoi
  32.    }


 
je te laisse imaginer le code pour l'envoi ...


Message édité par benou le 03-02-2004 à 23:21:39

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-02-2004 à 15:15:12    

chrisbk a écrit :


 
voui, certes, on peut faire plus fin comme gestion d'erreurs
 
 


 
Désolé de n'avoir commencé le java que le mois dernier ...
Pour le moment je me concentre sur le bon fonctionnement de mon programme, je verrais apres pour bien gerer les erreurs ! :-)

Reply

Marsh Posté le 04-02-2004 à 15:22:21    

benou a écrit :


 :pfff:  
Dis pas ca avec une telle certitude, ton code te contredit juste après ...
 
 
 
un read() ne retourne -1 que lorsque la fin du stream est atteinte. Dans le cas d'une socket, la fin d'un flux intervient quand il est fermé de l'autre côté.
 
Donc c'est tout à fait normal que ton while boucle jusqu'à se que tu ferme le flux : c'est ce que tu lui demande de faire.
 
Comme je te le disais, il faut que tu mettes en place un protocole réseau.
 
exemple : tu envois d'abord la taille du fichier (xml-length: 1234), un retour à la ligne, puis le fichier.
 
ce qui donne pour le code d'écoute :  

Code :
  1. private static final PROTO_XML_LENGTH = ""xml-length :";
  2. //...
  3.    int b;
  4.    while ((b = in.read()) != -1) {
  5.       // lecture de la longueur
  6.       StringBuffer buf = new StringBuffer(20);
  7.       do {
  8.          buf.append((char) b);
  9.       } while ((b = in.read()) != -1);
  10.       if (b == -1) {
  11.          break;
  12.       }
  13.       String line = buf.toString();
  14.       if (! buf.statsWith(PROTO_XML_LENGTH)) {
  15.           throw new NetworkProtocoleException("unknown command", line);
  16.       }
  17.       String lengthStr = line.substring(PROTO_XML_LENGTH.length);
  18.       int length;
  19.       try {
  20.          length = Integer.parseInt(lengthStr);
  21.       } catch (NumberFormatException e) {
  22.           throw new NetworkProtocoleException("bad xml length format", lengthStr, e);
  23.       }
  24.       // lecture du fichier XML  
  25.       // ici je le fait en un bloc pour simplifier mais il faudrait buffuriser la lecture ...
  26.       byte[] xmlFile = new byte[length];
  27.       int readSize = in.read(xmlFile, 0, length);
  28.       if (readSize  != length) {
  29.           throw new NetworkProtocoleException("incomplete transfert : waiting " + length + ", received " + readSize, e);
  30.       }
  31.       // ensuite tu en fais ce que tu veux de ton XML, et tu laisses boucler : on est prêt pour un nouvel envoi
  32.    }


 
je te laisse imaginer le code pour l'envoi ...


 
merci pour ton aide !
je vais bosser la dessus.
 
Donc pour l'envoie, je ne ferme plus mon BufferedOutputStream ?

Reply

Marsh Posté le 04-02-2004 à 16:26:22    

vinz13 a écrit :


 
merci pour ton aide !
je vais bosser la dessus.
 
Donc pour l'envoie, je ne ferme plus mon BufferedOutputStream ?


ben si tu veux qu'il reste ouvert pour pouvoir continuer à envoyer des trucs, vaut mieux pas le fermer [:spamafote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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