Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1381 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Socket et Serialisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Socket et Serialisation

n°1392984
Phraides
Posté le 22-06-2006 à 17:28:03  profilanswer
 

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
mood
Publicité
Posté le 22-06-2006 à 17:28:03  profilanswer
 

n°1393018
boulax
Inserer phrase hype en anglais
Posté le 22-06-2006 à 17:49:42  profilanswer
 

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.
n°1393031
Phraides
Posté le 22-06-2006 à 18:00:01  profilanswer
 

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
n°1393051
omega2
Posté le 22-06-2006 à 18:15:42  profilanswer
 

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.

n°1393108
nemohp
Adepte du provisoire permanent
Posté le 22-06-2006 à 20:15:16  profilanswer
 

les RMI sinon ça peut correspondre à tes besoins ?

n°1393271
Phraides
Posté le 22-06-2006 à 23:32:50  profilanswer
 

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 !

n°1393415
brisssou
8-/
Posté le 23-06-2006 à 09:31:53  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Socket et Serialisation

 

Sujets relatifs
[C] socket sur une plage d'adresse IPSocket et Selector
[MFC] Problème Port Socket[socket UDP] Codage BER : Format des Tag (TLG)
Socket Adresse IPSocket, envoyer autre chose que du texte?
Socket asynchroneTorque : problème de socket réutilisée
Probleme de sérialisation XML de collection d'objets VB .Net[perl embed] Probleme socket
Plus de sujets relatifs à : Socket et Serialisation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR