[Debutant] Pb avec ObjectOutputStream et les socket

Pb avec ObjectOutputStream et les socket [Debutant] - Java - Programmation

Marsh Posté le 26-02-2004 à 17:00:54    

J'arrive pas à comprendre où est le souci avec ce client et ce serveur qui communique par socket:
 
Client:

Code :
  1. import java.util.HashMap;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.io.ObjectInputStream;
  8. import xxx.Encours;
  9. public final class Client_tcp {
  10.     public Client_tcp() {
  11.      
  12.         Encours e1   = new Encours("E1" );
  13.         Encours e2   = new Encours("E2" );
  14.         Encours e100 = new Encours("E100" );
  15.      
  16.         try {
  17.             Socket s = new Socket("localhost",5432);
  18.             OutputStream os = s.getOutputStream();
  19.             InputStream  is = s.getInputStream();
  20.             ObjectOutputStream oos = new ObjectOutputStream(os);
  21.             ObjectInputStream ois = new ObjectInputStream(is);
  22.             e1.setCurrent(new Integer(1));
  23.             System.out.println("envoi de "+e1.getName()+" avec current="+e1.getCurrent());
  24.             oos.writeObject(e1);
  25.            
  26.             e2.setCurrent(new Integer(2));
  27.             System.out.println("envoi de "+e2.getName()+" avec current="+e2.getCurrent());
  28.             oos.writeObject(e2);
  29.             e1.setCurrent(new Integer(3));
  30.             System.out.println("envoi de "+e1.getName()+" avec current="+e1.getCurrent());
  31.             oos.writeObject(e1);
  32.            
  33.             e100.setCurrent(new Integer(100));
  34.             System.out.println("envoi de "+e100.getName()+" avec current="+e100.getCurrent());
  35.             oos.writeObject(e100);
  36.            
  37.             s.close();
  38.         } catch(Exception e) {
  39.             // Traitement d'erreur
  40.             e.printStackTrace();
  41.         }
  42.     }
  43.    
  44.     public static void main(String a[]) throws Exception {
  45.         new Client_tcp();
  46.     }
  47. }


 
Serveur:

Code :
  1. import java.net.ServerSocket;
  2. import java.net.Socket;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.io.ObjectInputStream;
  8. import java.rmi.RemoteException;
  9. import java.util.HashMap;
  10. import xxx.Encours;
  11. public final class Serveur_tcp {
  12.    
  13.     public Serveur_tcp() {
  14.         Encours msg;
  15.        
  16.         try {
  17.             ServerSocket ecoute = new ServerSocket(5432,5);
  18.             Socket service = (Socket)null;
  19.             while(true) {
  20.                 service = ecoute.accept();
  21.                 OutputStream os = service.getOutputStream();
  22.                 InputStream  is = service.getInputStream();
  23.                 ObjectOutputStream oos = new ObjectOutputStream(os);
  24.                 ObjectInputStream ois = new ObjectInputStream(is);
  25.                 do
  26.                 {
  27.                     msg = (Encours) ois.readObject();
  28.                     System.out.println("==>"+msg.getCurrent());
  29.                     } while(msg.getCurrent() < 10);
  30.                 System.out.println("fin de session" );
  31.             }
  32.             //service.close();
  33.         } catch (Exception e) {
  34.             // traitement d'erreur
  35.             e.printStackTrace();
  36.         }
  37.     }
  38.    
  39.     public static void main(String a[]) throws Exception {
  40.         new Serveur_tcp();
  41.     }
  42.  
  43. }


 
 
Voici ce qu'envoie le client (resultat "normal" ):

Code :
  1. envoi de EV4 avec current=1
  2. envoi de EV5 avec current=2
  3. envoi de EV4 avec current=3
  4. envoi de E100 avec current=100


 
Voici ce que recoit le serveur:

Code :
  1. ==>1
  2. ==>2
  3. ==>1
  4. ==>100
  5. fin du serveur


 
Pourquoi le serveur ne recoit-il pas la version "maj" de mon objet e1, avec la valeur "3", telle qu'elle a ete affectée dans le client ???


Message édité par etheriel le 26-02-2004 à 17:01:45
Reply

Marsh Posté le 26-02-2004 à 17:00:54   

Reply

Marsh Posté le 26-02-2004 à 17:13:33    

etheriel a écrit :


 
            e1.setCurrent(new Integer(1));
            System.out.println("envoi de "+e1.getName()+" avec current="+e1.getCurrent());
            oos.writeObject(e1);
             
            e2.setCurrent(new Integer(2));
            System.out.println("envoi de "+e2.getName()+" avec current="+e2.getCurrent());
            oos.writeObject(e2);
 
            e1.setCurrent(new Integer(3));
            System.out.println("envoi de "+e1.getName()+" avec current="+e1.getCurrent());
            oos.writeObject(e1);
           


Ca ne serait pas plutôt "e3.setCurrent(new Integer(3));" ?
 

Reply

Marsh Posté le 26-02-2004 à 17:26:50    

non, non , justement: e1.setCurrent(....)
je m'attends à ce que l'objet e1, que j'ai deja transmis une fois, soit transmis à nouveau avec cette nouvelle valeur. Or c'est l'ancienne qui est recupérée !

Reply

Marsh Posté le 26-02-2004 à 17:30:37    

Oups pardon j'avais mal lu ton code désolé :(

Reply

Marsh Posté le 27-02-2004 à 10:04:38    

up !
 
Personne n'a une idée ?


Message édité par etheriel le 27-02-2004 à 10:04:48
Reply

Marsh Posté le 26-03-2004 à 23:54:55    

moi je dirrais que le probleme se situe au niveau de xxx.Encours

Reply

Marsh Posté le 27-03-2004 à 10:25:27    

code de setCurrent ?

Reply

Marsh Posté le 27-03-2004 à 14:47:56    

moi, d'un point de vue personnel, j'aimerais bien voir ta classe Encours stp :)  :jap:

Reply

Marsh Posté le 28-03-2004 à 15:04:59    

Je replace ici un post que j'avais fait dans le topic de HannibalAlBundie, ca convient aussi je pense ;)
 
J'ai eu des problèmes aussi avec les streams via des sockets. Par contre je me rappele plus dequels exactement mais je viens de jeter un oeil à mon code.
 
Et en gros, y a deux problèmes, deux bugs référencés :
 
- http://developer.java.sun.com/deve [...] 26188.html
- http://developer.java.sun.com/deve [...] 65324.html
 
Le premier précise qu'il faut récupérer le OutputStream avant le InputStream sur la socket. C'est ce que tu fais.
 
Le second, je sais plus exactement ce que c'est mais à cause de lui, dans mon code j'ai un  

Code :
  1. outputStream.reset();


placé systématiquement AVANT de faire un readObject() sur l'outputStream.
 
Je pense que dans le cas précis, le reset permettrait de résoudre le problème :)


---------------
Idéaliste pragmatique gauchiste cherche camarades pour fonder un parti
Reply

Sujets relatifs:

Leave a Replay

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