IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Envoi d'objet par réseau


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut Envoi d'objet par réseau
    Bonjour,

    tout est dans le titre, je cherche à envoyer un objet par le réseau.

    J'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Partie privé : 
     
    private ObjectOutputStream output; 
    private ObjectInputStream input; 
    output=new ObjectOutputStream(Csoc.getOutputStream()); 
    output.flush(); 
    input=new ObjectInputStream(Csoc.getInputStream()); 
     
    Ecriture d un message : 
     
    output.writeObject(new objet_a_envoyer(arg1,arg2)); 
    output.flush(); 
     
    Lecture d un message : 
     
    (objet_a_envoyer) input.readObject();
    J'ai essayé de l'utiliser pour un objet d'une classe voiture que j'ai crée.
    Malheureusement j'ai une erreur à la compilation pour la lecture de l'objet.

    voiture1 étant un objet de type voiture, lorsque j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    voiture1 = (voiture)input.readObject();
    -> "unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown"


    Help me

  2. #2
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    ça veux dire que cette méthode peut te renvoyer une exception et qu'il faut donc que tu l'intercepte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try{
    voiture1 = (voiture)input.readObject();
    }catch(ClassNotFoundException e)
    {
    System.err.println(e.getMessage());
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut
    Ah effectivement la compilation marche ^^ merci !

    Par contre... à l'éxecution, j'ai une erreur d'entrée sortie quand le programme arrive au "try { voiture1... ".

    Si je supprime le try et tout ce qu'il contient, le programme se déroule normalement, il y a donc un problème d'entrée sortie à cet endroit :s

    Une tite idée d'où ça peut venir ? ^^

  4. #4
    Invité
    Invité(e)
    Par défaut
    salut,
    comment tu envoie les objets il serait plus facile de les rendres sérailizable et les envoyer eux même.

  5. #5
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Citation Envoyé par SAKDOSS
    Ah effectivement la compilation marche ^^ merci !

    Par contre... à l'éxecution, j'ai une erreur d'entrée sortie quand le programme arrive au "try { voiture1... ".

    Si je supprime le try et tout ce qu'il contient, le programme se déroule normalement, il y a donc un problème d'entrée sortie à cet endroit :s

    Une tite idée d'où ça peut venir ? ^^
    Donne nos plus de code, sinon ça va être difficile de t'aider

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut
    Salut,

    les objets sont envoyés par :
    output.writeObject(new objet_a_envoyer(arg1,arg2));

    Par contre je ne sais pas ce que c'est que de rendre un objet sérialisable :p (la définition de wikipédia m'éclaire pas vraiment).

    Je vous met la class du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    import java.net.*;
    import java.io.*;
     
    public class clientbis 
    {
       private ObjectOutputStream output; 
       private ObjectInputStream input; 
     
       public clientbis()
        {             
            String serveur="JESSICA"; //Nom du server   
            try 
            {
                Socket soc = new Socket(serveur, 5000);
                output=new ObjectOutputStream(soc.getOutputStream()); 
                output.flush(); 
                input=new ObjectInputStream(soc.getInputStream()); 
                voiture V1 = new voiture(2,2,2,2,true);
                try{V1=(voiture)input.readObject();}
                catch(ClassNotFoundException e) 
                    {System.err.println(e.getMessage());}
                soc.close();
            }
            catch(UnknownHostException e)
                { System.out.println("le nom du serveur est inconnu"); }
            catch(IOException e)
                { System.out.println("Erreur entree/sortie pendant la connexion"); }
        }
        public static void main(String args[])
            { clientbis test = new clientbis(); }
    }

  7. #7
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par SAKDOSS
    voiture V1 = new voiture(2,2,2,2,true);
    Je crois que je vais faire une dépression... les conventions de nommage en POO, c'est:
    - noms de classe débutant par une majuscule
    - noms d'attributs, d'objets... débutant par une minuscule

    Donc: Voiture v1 = new Voiture(2,2,2,2,true);

    Ca sera beaucoup mieux!

    Ensuite pour les objets serialisables, la javadoc t'aclairera sans doute plus:
    java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html

    En gros, une classe est serializable si tu peux le transformer tout objet de cette classe en un flot de données (Stream) qui le décrit parfaitement.
    "décrit parfaitement", ça veut dire qu'à partir de ce flot uniquement, tu es capable de reconstruire ton objet à l'identique.

    Pour schématiser, ta classe a deux méthode: une de "sauvegarde de l'objet", et une de "régénération de l'objet à partir de sa sauvegarde".

    En espérant que ça t'éclaire...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut
    Merci CyberChouan,

    pour ce qui est du nommage oui je suis désolé c'est assez moche ^^. Je n'ai vu ces conventions que récement comme mon projet est assez pressé et que je m'arrache les cheuveux sur le réseau je n'ai pas eu le temps de tout remettre.

    Bon je vois bien comment marche la sérialisation, j'ai juste des (gros ?) problèmes pratique.

    J'ai vu des exemples sur internet qui marchent mais pas en réseau. Il doit juste y avoir quelques petites modifications mais comme je maitrise pas vraiment le domaine je tourne en rond .

    Je suis repartis de 0 pour faire plus simple.
    J'ai crée une class Transfert (avec majscule ! ) et je souhaite donc à la transmettre via le réseau.

    La classe possède :
    - 1 constructeur
    - 1 fonction Serializer()
    - 1 fonction Deserializer()

    Pour l'instan je peux uniquement "sérialiser" un objet dans un fichier transfert.ser puis le "déserialiser".

    Voici la class :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.net.*;
    import java.io.*;
     
    public class Transfert implements java.io.Serializable 
    {
        private int [] loc = {0,0};
     
        public Transfert(int loc1,int loc2) //Constructeur
        {
            loc[0]=loc1;
            loc[1]=loc2;
        }
     
        public void Serializer( )  //Sérialise l'objet dans le fichier "transfert.ser
        {
            try 
            {
                FileOutputStream fichier = new FileOutputStream("transfert.ser");
                ObjectOutputStream oos = new ObjectOutputStream(fichier);
                oos.writeObject(this);
                oos.flush();
                oos.close();
            }
            catch (java.io.IOException e) 
                {e.printStackTrace();}
        }
     
        public void Deserializer() //Désérialise l'objet depuis le fichier "transfert.ser
        {
            try 
            {
                FileInputStream fichier = new FileInputStream("transfert.ser");
                ObjectInputStream ois = new ObjectInputStream(fichier);
            } 
            catch (java.io.IOException e) 
                {e.printStackTrace();}
            catch (ClassNotFoundException e) 
                {e.printStackTrace();}
        }
     
    }
    Ces méthodes marchent. Je voudrais maintenant passer le fichier par le réseau.
    Je pense qu'en mettant un Socket en argumant et en modifiant un peu les méthodes Serializer() et Deserializer() ça devrais pouvoir marcher.
    Mais je n'arrive pas à le faire correctement

    C'est grave docteur ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut
    J'ai finalement trouvé !!! <content>

    bon ça fait plaisir même c'était pas très compliqué mais ça en l'ai jamais quand on sais ^^.

    Donc en résumé :

    Class Transfert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import java.net.*;
    import java.io.*;
     
    public class Transfert implements java.io.Serializable 
    {
        private int [] loc = {0,0};
     
        public Transfert(int loc1,int loc2)
        {
            loc[0]=loc1;
            loc[1]=loc2;
        }
     
        public int getLoc1()
        {return loc[0];}
     
        public void Serializer(Socket Csoc) 
        {
            try 
            {
                ObjectOutputStream oos = new ObjectOutputStream(Csoc.getOutputStream());
                oos.writeObject(this);
                oos.flush();
                oos.close();
            }
            catch (java.io.IOException e) 
                {e.printStackTrace();}
        }
     
        public Transfert Deserializer(Socket Csoc)
        {
            Transfert transfert = new Transfert(0,0);
            try 
            {
                ObjectInputStream ois = new ObjectInputStream(Csoc.getInputStream());
                transfert = (Transfert) ois.readObject();          
            } 
            catch (java.io.IOException e) 
                {e.printStackTrace();}
            catch (ClassNotFoundException e) 
                {e.printStackTrace();}
            return transfert;  
     
        }
    }
    Le server utilise : Serializer(socket)
    et le client le reçoit par : transfert = transfert.Deserializer(socket);


    Merci à tout le monde pour l'aide

  10. #10
    Invité de passage
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1
    Par défaut
    Bonjour,

    Est-il possible de faire la même chose en C# ?

    En effet pour le moment je n'arrive qu'à envoyer des chaînes de caractères et je voudrais envoyer des objets.

    Merci d'avance pour vos réponses.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Envoi objet par mail " Alerte !"
    Par Pittouti dans le forum IHM
    Réponses: 3
    Dernier message: 05/07/2012, 10h36
  2. envoie d'objet en réseau
    Par demonia dans le forum C#
    Réponses: 4
    Dernier message: 18/07/2008, 20h24
  3. Réponses: 2
    Dernier message: 19/09/2007, 10h21
  4. [Socket] Envoi de texte et d'objets par socket
    Par ced dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 05/08/2004, 09h07
  5. Envoi de Datagrames par IP en JAVA
    Par the java lover dans le forum Développement
    Réponses: 2
    Dernier message: 14/08/2002, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo