Socket et Serialisation

Socket et Serialisation - Java - Programmation

Marsh Posté le 22-06-2006 à 17:28:03    

Bonjour a tous,
 
voila j'essai de faire un petit programme de test simple pour tester l'echange d'objet entre un client et un serveur a l'aide de socket et je me heurte a un probleme.
L'objet que je tranfere est un objet de la classe Echange :
 
J'utilise netbeans et j'ai crée 2 projets, un projet testclient et un projet testserver. Dans chaque projet j'ai crée une classe Echange ou j'ai copié collé le meme code.
(je pense que le probleme vient de la : peut etre qu'a lexecution il considere que ce sont 2 classes differentes?)
 
Voila le code de la classe echange :
 

Code :
  1. package testclient;
  2. import java.util.*;
  3. import java.io.*;
  4. public class Echange implements Serializable{
  5.    
  6.     int x;
  7.    
  8.     public Echange() {
  9.     }
  10.    
  11.     public Echange(int x) {
  12.            
  13.             this.x=x;
  14.     }
  15.    
  16. }


 
Voila le code du serveur :
 

Code :
  1. package testserver;
  2. import java.net.*;
  3. import java.util.*;
  4. import java.io.*;
  5. public class Main {
  6.    
  7.     public Main() {
  8.     }
  9.    
  10.     public static void main(String[] args) throws Exception
  11.     {
  12.         ServerSocket ss = new ServerSocket(2000);
  13.         Socket s=ss.accept();
  14.         ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
  15.         ObjectInputStream in = new ObjectInputStream(s.getInputStream());
  16.         Echange transfert = (Echange)in.readObject();
  17.        
  18.         System.out.println(transfert.x);
  19.     }
  20.    
  21. }


 
Et enfin le code du client :
 

Code :
  1. package testclient;
  2. import java.io.*;
  3. import java.net.*;
  4. import java.util.*;
  5. public class Main {
  6.    
  7.     public Main() {
  8.     }
  9.    
  10.     public static void main(String[] args) throws Exception
  11.     {
  12.      
  13.         Socket s = new Socket("localhost",2000);
  14.         ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
  15.         Echange transfert = new Echange(42);
  16.        
  17.         out.writeObject(transfert);
  18.     }
  19.    
  20. }


 
Donc a priori , rien de bien compliqué. Lorsque je lance le serveur et que je tente de me connecter dessus, j'obtiens l'erreur suivante: (c'est la ligne du readObject()  qui la cause)
 

Code :
  1. Exception in thread "main" java.lang.ClassNotFoundException: testclient.Echange
  2.         at java.net.URLClassLoader$1.run(Unknown Source)
  3.         at java.security.AccessController.doPrivileged(Native Method)
  4.         at java.net.URLClassLoader.findClass(Unknown Source)
  5.         at java.lang.ClassLoader.loadClass(Unknown Source)
  6.         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
  7.         at java.lang.ClassLoader.loadClass(Unknown Source)
  8.         at java.lang.ClassLoader.loadClassInternal(Unknown Source)
  9.         at java.lang.Class.forName0(Native Method)
  10.         at java.lang.Class.forName(Unknown Source)
  11.         at java.io.ObjectInputStream.resolveClass(Unknown Source)
  12.         at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
  13.         at java.io.ObjectInputStream.readClassDesc(Unknown Source)
  14.         at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
  15.         at java.io.ObjectInputStream.readObject0(Unknown Source)
  16.         at java.io.ObjectInputStream.readObject(Unknown Source)
  17.         at testserver.Main.main(Main.java:36)


 
 
Je pense que cela vient donc des 2 fichiers differents pour designer la meme classe .. Peut on partager une classe entre 2 projets dans netbeans?
Peut etre que je me trompe totalement et que c'est autre chose ! Quelqu'un aurait t'il une idée?
 
Merci !


Message édité par Phraides le 22-06-2006 à 17:33:55
Reply

Marsh Posté le 22-06-2006 à 17:28:03   

Reply

Marsh Posté le 22-06-2006 à 17:49:42    

Y'a deux soucis.  
Effectivement a la serialisation il faut que l'objet recu soit de la meme classe et de la meme version de classe (voir la doc la dessus, je sais plus exactement le nom de l'attribut qui donne le numero de version de classe). Mais ton probleme n'est pour l'instant pas là puisque ton exception n'a rien a voir avec la serialisation. Là ton erreur indique que le programme ne trouve pas la classe Echange au runtime.


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 22-06-2006 à 18:00:01    

D'accord, pourtant, quand je fais un Echange test = new Echange(50);
 
et ensuite un System.out.println(test.x); tout marche bien, il m'affiche 50, que ce soit dans le client ou dans le serveur .. ce qui signifie qu'il trouve bien la classe !!
 
 
Edit : j'ai trouvé ca sur le net :

Citation :

Le contrôle de version
 
Java propose un mécanisme permettant de "résoudre" le problème de la lecture d'un objet d'une classe qui a évolué depuis que l'objet a été sauvegardé. Par défaut une exception ClassNotFoundException est levée si les deux classes sont différentes.


 
C'est peut etre donc ca !
 
Saurais tu comment partager une meme classe dans 2 projets differents, sur netbeans?
 
Ou alors peut etre que je peux mettre le serveur et le client dans un meme projet, mais il me faudrais quand meme 2 executables , comment faire ca?


Message édité par Phraides le 22-06-2006 à 18:07:15
Reply

Marsh Posté le 22-06-2006 à 18:15:42    

Si tu veux partager une classe entre deux projets, une solution, est de générer un .jar contenant les différentes classes comunes.
De cette maniére, tu seras sur que t'auras la même version des classes des deux côtés et en plus, tu seras certain que l'arborescence des classes sera respecter à l'identique.
 
Là, pour le moment, si tu ne veux pas mettre en place un systéme de .jar, tu peux créer un "package" nomé "testclient" dans le serveur afin de te retrouver avec la même classe dans le même paquage. En effet, en java, deux classes sont considéré comme différentes si elles n'ont pas le même nom ou qu'elles appartiennent à des packages différents.

Reply

Marsh Posté le 22-06-2006 à 20:15:16    

les RMI sinon ça peut correspondre à tes besoins ?

Reply

Marsh Posté le 22-06-2006 à 23:32:50    

Merci pour vos reponses !
 
Oui je pense que les RMI serait plus pratique mais bon je voudrais quand meme arriver a faire marcher ma serialisation ^^
 
Je vais essayer de mettre en place un systeme de .jar commun ca me parait une bonne idée !
 
Encore une question, dans un meme projet, peut on generer plusieurs executables ? car si je met mes classes, mon server et mon client dans le meme projet, et que j'arrive a generer uun executable server, et un executable client, ca marcherait aussi !
 
Merci !

Reply

Marsh Posté le 23-06-2006 à 09:31:53    

oui, il faudrait mettre ton jar dans le classpath (option "-cp" je crois) et tu pourrais lancer les main des classes que tu veux.
 
mais ça semble un peu incohérent de mettre client et serveur dans la même archive...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Sujets relatifs:

Leave a Replay

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