Problème avec ObjectInputStream

Fayzaj Messages postés 7 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 20 juillet 2010 - 21 sept. 2008 à 14:41
Fayzaj Messages postés 7 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 20 juillet 2010 - 27 sept. 2008 à 15:00
salut,
J'ai deux applications une serveur et l'autre client et j'envoi des
objets grâce à ObjectOutputStream et les reçoit grâce à
ObjectInputStream.

Mais quand le client envoie un objet de type file   vers mon serveur en utilisant :
File ftosend=new File(chemin);
out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(ftosend);
et en le receptionant sur le serveur en utilisant:
SsAccept_in = new ObjectInputStream(SSAccept.getInputStream());
File resultat=(File)SsAccept_in.readObject();
objectIn.readObject();
mais  au niveau de serveur il m'affiche l'erreuur suivant:
Connexion:java.io.FileNotFoundException: " /usr/test/monfichier" (No such file or directory)Connexion: connexion terminée
 meme quand j'essaie de lire ce fichier avant de l'envoyer et mis tout ces lignes dans un ArrayList puis j'envoie comme objet ce ArrayList mais quand j'essaie de lire au niveau serveur il boucle à l'infini

quelqu'un aurait'il une explication sur ces deux methodes ?
Merci

8 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 sept. 2008 à 08:25
Salut:

Pourquoi utilises tu un objet File? Tu peux sérialiser un objet directement.

public class Bean implements Serializable {
    // ...
}

// Côté client
Bean bean = new Bean();
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(bean);

// Côté serveur
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Bean bean = (Bean)ois.readObject();
0
Fayzaj Messages postés 7 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 20 juillet 2010
22 sept. 2008 à 13:31
Salut,
merci pour votre réponse mais avant testé cette solution  j'ai un probleme avec la serialisation donc est ce que ce code est juste??
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
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 sept. 2008 à 13:52
Salut:

Tout semble être bien fait. Cependant, je te conseille de:

1. Ajouter un constructeur par défaut.
2. Générer automatiquement le variable serialVersionUID à l'aide d'un IDE (Eclipse, ...), en effet cet identifiant est calculé à l'aide d'une procédure un peu complexe en fonction de tous les membres publiques et protégés de la classe (Il permet d'identifier d'une façon unique une classe donnée). Ou bien ne pas le déclarer, la JVM va se débrouiller pour le faire.
0
Fayzaj Messages postés 7 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 20 juillet 2010
23 sept. 2008 à 12:40
salut,
j'ai testé cette solution 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 j'ai deja envoyé précedament 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.(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:
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();
     }
     }

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
24 sept. 2008 à 08:13
Salut:

Tu dois inclure la classe Bean dans la partie client et la partie serveur. Pour cela, il vaut mieux, l'exporter en tantque fichier JAR.
Il faut que la classe Bean soit accessible aux deux modules: module client & module serveur.

Note: Ce genre de problème est dû et couplage fort entre les modules distribués de l'application.
0
Fayzaj Messages postés 7 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 20 juillet 2010
24 sept. 2008 à 15:05
salut,

la classe Bean.class  a situé au packageMachineServer avec la classe Serveur dans la machine de serveur et danse le package package Machineclient avec la classe Client au machine client
Merci
0
Fayzaj Messages postés 7 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 20 juillet 2010
27 sept. 2008 à 13:56
salut,
ce problème a réglé avec le 3 jar qui contient Bean.class mais le problème 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
0
Fayzaj Messages postés 7 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 20 juillet 2010
27 sept. 2008 à 15:00
Salut,
pske ma classe  Bean.class peut recupérer juste le chemin de fichier  donc j'ai ajouter une méthode qu'a lu le contenu de ce fichier et mis dans ArrayList mais quand je déserialise il affiche des erreur au niveu client
merci
0
Rejoignez-nous