pr de déserialisation des objet envoyer par socket

rhifay
pr de déserialisation des objet envoyer par socket

salut,
j'ai un pb avec une comunication par socket entre deux machines l'une comme client et l'autre serveur qui envoie des fichiers aux client ,mais au niveux client quand je recois l'objet et essayé de déserialisé avec la classe Bean qui situé au machine serveur pour sérialisé et au niveaux machine client pour déserialisé elle m'affiche le problème suivant au niveau client:

java.lang.ClassNotFoundException:packageMachineServer.Bean
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.io.ObjectInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at packageMachineclient.Client.<init>(Clientstream.java:16)
    at packageMachineclient.Client.main(Clientstream.java:37)

la ligne 16 est:
Bean fileIO=(Bean)ois.readobject();

et voila mon code de seveur:

package packageMachineServer;
import java.io.*;
import java.net.*;
public class Server{
public Server() {
     File[] filenvoye = new File[1];
     filenvoye[0] = new File("/home/workspace/testEfile");
    //sérialiser       
      Bean files = new Bean(filenvoye);
      OutputStream os;
      ServerSocket socket;
      try {
           ObjectOutputStream oos;
           System.out.println("En ecoute .......");
           socket = new ServerSocket(1024);
           Socket SsAccept;
           while(true){
           SsAccept = socket.accept();
           //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            os = SsAccept.getOutputStream();
               oos = new ObjectOutputStream(os);
               //envoyer les donne
               oos.writeObject(files);
               System.out.println("les donne sont envoyer;;;;;;;;");
               }
            //os.close();
               //oos.close();
               //SsAccept.close();
               } catch (UnknownHostException e) {
               e.printStackTrace();
               } catch(IOException exp){
                    exp.printStackTrace();
           }
           //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          }
   
    public static void main(String[] args) {
        new Server();
    }
}

et ma classe au niveux client est:

[code]package packageMachineclient;
import java.io.*;
import java.net.*;
public class Client {
    public Client() {
     Socket socket;
     try {
     socket = new Socket("192.186.0.133",1024);
     //On ouvre notre flux d'entrée
     InputStream is = socket.getInputStream();
     ObjectInputStream ois = new ObjectInputStream(is);
     //On cast l'objet pour en retirer les informations
     Bean fileIO = (Bean)ois.readObject();
     String texte = new String(" ");
     for (int i=0;i<fileIO.lenght();i++){
     fileIO.redfile(i);
     //Affiche la liste des fichiers qui ont été envoyés
     System.out.println("Le fichier est :"+fileIO.getFile(i).getPath());
     texte+=fileIO.getFile(i).getPath();
     texte+='\n';
     }
     ois.close();
     is.close();
     socket.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
     catch (ClassNotFoundException e) {
     System.out.println("voila mon problem"+e.getCause());
     e.printStackTrace();
     }
     }
     public static void main (String []arg){
        new Client();
     }
     }

[/code]
et enfin pour la classe Bean de sérialisation:

import java.io.*;
import java.net.*;
public class Bean implements Serializable{
 private static final long serialVersionUID = 1L;
 private File[] file;
 private int lenght;
 public Bean(File[] file) {
      super();
       this.file = file;
       this.lenght=file.length;
    }
   public int lenght() {
        return lenght;
    }
  
    public File getFile(int i) {
        return file[i];
    }
}

Merci

fredericmazue

Je pense que le coeur du problème est là:

Quote:
java.lang.ClassNotFoundException:packageMachineServer.Bean

MachineServer.bean doit être dans le CLASSPATH côté client. En plus de l'être côté serveur.

rhifay

salut,
merci pour vos reponses mais stp comment je peut modiffier CLASSPATH côté client malgré que la classe Bean situé au niveux client et au niveaux serveur
merci

fredericmazue

quand tu désérialises tu as ça dans ton code et c'est normal
Bean fileIO = (Bean)ois.readObject();
Pour que la JVM puisse faire le transtypage, elle doit savoir ce que c'est que Bean. Donc Bean.class doit être dans le CLASSPATH du client, que tu le veuilles ou non.
Ca veut dire que celui qui veut utiliser ton client sur sa machine doit au préalable y déposer Bean.class et le faire pointer par le CLASSPATH.

Maintenant si tu me le permets, tu n'as aucun intérêt à sérialiser là. Les données que tu sérialises sont lues dans fichier. Qu'est-ce qui t'empêche d'expédier le tout dans le flux du socket, sans sérialiser ?

La séralisation c'est intéressant que tu veux sauvegarder un objet avec son état, le transmettre et et le reconsituer à l'autre bout du fil. Ce n'est pas le cas ici avec les données de ton fichier.

rhifay

Salut,
merci pour vos reponse oui je sérialise objet,pske quand j'envoie le fichier sans sérialisation de post serveur au cliet par socket j'ai rencontré meme probleme au niveu cliet
et stp comme la class Bean.class doit être dans le CLASSPATH du client
malgre que bean.class situé au niveux post client et meme pour le serveur
Merci

fredericmazue

Quote:
quand j'envoie le fichier sans sérialisation de post serveur au cliet par socket j'ai rencontré meme probleme au niveu cliet

Bien sûr que non. Tu as fait erreur quelque part.

Quote:
stp comme la class Bean.class doit être dans le CLASSPATH du client

En la mettant dans le CLASSSPATH....
Pardonne moi, je ne me moque pas. Mais vraiment, je ne vois pas toi te dire d'autre et de mieux... :oops:

rhifay

salut,
stp je peut savoir comment la class Bean.class doit être dans le CLASSPATH du client
malgre que bean.class situé au niveux post client et meme pour le serveur
Merci

fredericmazue

EN LA METTANT dans le CLASSPATH.

Pas la peine de t'énerver ça va pas résoudre ton problème. J'essaie de t'aider...
Et vraiment il n'y a rien d'autre à te dire que ce que je t'ai dit deux posts plus haut. Du moins à partir des informations que tu donnes.

rhifay

salut,
ce problème a réglé avec le 3 jar qui contient Bean.class mais le problème est SVP comment je peut recuperer les donnes de ce fichier????est ce que il faut d'ajouter une autre méthode au ma classe Bean qu'a lu les donné de ce fichier??????????????
Merci

fredericmazue

Salut :)

Quote:
ce problème a réglé avec le 3 jar qui contient Bean.class

Et ben voilà :)

Quote:
comment je peut recuperer les donnes de ce fichier????

Maintenant que les problèmes de base sont réglés ;) on va pouvoir parler de choses plus sérieuses.

Très important sur le fond: Le fichier, et donc les données, tu ne les as pas envoyées sur le réseau, si je ne m'abuse. A moins que je n'ai pas compris ton code ou que tu n'ais pas tout dit.
Mais quand tu fais

Bean files = new Bean(filenvoye);

fileenvoye est de type File. C'est une référence sur un objet de ce type. Si je comprends ton code, c'est cette référence que tu fais voyager sur le réseau, et pas le contenu du fichier même.

Mais sur le fond, encore une fois, tu n'as pas besoin de sérialiser pour faire ce que tu veux faire. Il me semble même que sérialiser te compliquer la vie. Envoie les données octet par octet dans le flux du socket côté serveur. Ensuite ton client lit les données octet par octet dans le flux de socket, et les données seront transférées, c'est aussi simple que ça.

slevy

Le plus simple pour faire de la communication java / java distante c'est d'utiliser RMI.
Il est possible de définir l'endroit ou se trouvent les classes :
-Djava.rmi.server.codebase=http://server/export/