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 :

[socket] envoie d'objet


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut [socket] envoie d'objet
    Hello tout le monde...

    Alors voila ce que j'aimerais faire:


    Pour commencer mon 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
     
    public class Client {
     
        public static void main(String[] args) {
     
            try {
     
                 Socket socket = new Socket("christophe", 6000);
                 ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
     
     
                 output.writeObject(new Essai());
                 output.flush();
                 output.reset();
     
            }
            catch(Exception e) {}
     
        }
    }


    Ma classe Essai, qui normalement doit être envoyé au serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Essai implements Serializable, Interaction {
     
    	public void execute() {
     
    		System.out.println("coucou");
    	}
    }
    Et mon interface Interaction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface Interaction {
     
    	public void execute();
    }


    Et pour finir, voici une petite partie du serveur qui récupère le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try {
     
        input = new ObjectInputStream(socket.getInputStream());
     
        Interaction interaction = (Interaction) input.readObject();
        interaction.execute();
    }
    catch(Exception e) {}

    Vous l'avez peut-être compris en voyant le code, mon but est d'envoyer des objets qui implements l'interface Interaction pour que le serveur puisse executer le code qui se trouve dans la fonction execute()...

    Mon problème : Ma classe Essai que j'envoie au serveur n'existe pas du coter du serveur, j'ai donc une exception java.lang.ClassNotFoundException qui est lever lors de l'execution...

    Ma question est donc la suivante : Comment je peux faire pour récupèrer un objet sur le serveur qui n'est pas connu... (qui n'a pas de .class du coté serveur) ?

    Je sais pas si j'ai été assez claire.... si c'est pas le cas posez moi des questions

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il me semble que le serveur doit necessairement avoir le .class de l'interface Interaction (le serveur doit connaitre la structure de l'objet qu'il désérialize)
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    Citation Envoyé par le y@m's
    Il me semble que le serveur doit necessairement avoir le .class de l'interface Interaction (le serveur doit connaitre la structure de l'objet qu'il désérialize)
    Le serveur connais l'interface Interaction mais apparemment ca ne suffit pas !!!

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Le fait est que tu serialize un objet Essai, le serveur doit donc recuperer un objet Essai et donc le connaitre. Essaye de caster ton objet en Interaction avant de serializer
    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
    public class Client {
     
        public static void main(String[] args) {
     
            try {
     
                 Socket socket = new Socket("christophe", 6000);
                 ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
     
     
                 output.writeObject((Interaction) new Essai());
                 output.flush();
                 output.reset();
     
            }
            catch(Exception e) {}
     
        }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    Citation Envoyé par le y@m's
    Le fait est que tu serialize un objet Essai, le serveur doit donc recuperer un objet Essai et donc le connaitre. Essaye de caster ton objet en Interaction avant de serializer
    Ca ne marche pas... la meme erreur...

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    As-tu essayé en mettant la classe Essai à disposition du serveur ?
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  7. #7
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    Citation Envoyé par le y@m's
    As-tu essayé en mettant la classe Essai à disposition du serveur ?
    Oui mais moi mon but est de ne pas mettre la classe a disposition du serveur... ca me permetterai d'executer n'importe quel code coté serveur sans le modifier !

    (mais oui ca marche si je mets la classe a disposition)

  8. #8
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Commentaire
    Je pense que tu as besoin d'un ClassLoader pour éxecuter le code.

    Je ne sais pas si c'est possible mais il faudrait sauver ta classe dans un objet et que l'instance de ton Classloader charge le code de ta classe.

    [EDIT]Le principal problème est quand tu transmets un objet, tu ne transmets que les données de ton instance mais pas le code de la classe.

    Pour résoudre ton problème, il faut envoyer le code de la classe et les données de l'instance.
    [/EDIT]

  9. #9
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    Citation Envoyé par jowo
    Commentaire
    Je pense que tu as besoin d'un ClassLoader pour éxecuter le code.

    Je ne sais pas si c'est possible mais il faudrait sauver ta classe dans un objet et que l'instance de ton Classloader charge le code de ta classe.

    [EDIT]Le principal problème est quand tu transmets un objet, tu ne transmets que les données de ton instance mais pas le code de la classe.

    Pour résoudre ton problème, il faut envoyer le code de la classe et les données de l'instance.
    [/EDIT]
    Si je comprends bien ce que tu veux dire, il faudrait que je modifie le ClassLoader pour qu'il charge la classe qu'il me faut qui serait présent dans l'objet que j'envoie ?

    oki oki... mais alors si quelqu'un peut me donner des renseignements sur comment changer le ClassLoader et mettre ma classe dans un objet....

    Merci d'avance

  10. #10
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Je ne connais pas trop le ClassLoader, mais je tenterais ceci :
    - Le client envoie la classe puis son instance au serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    output.writeObject(Essai.class);
    output.writeObject(new Essai());
    - Le serveur charge la classe puis l'instance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ClassLoader loader = new ClassLoader();
    ...
    Class class = input.readObject();
    loader.resolveClass(class); //ou loadClass ??
    //et la, je sais faire Class.newInstance, mais pour désérialiser ...
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  11. #11
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    je n'ai pas réussi à utilisé ta méthode xaylours mais j'ai fait d'une autre manière...

    lorsque le serveur lève une exception comme quoi la class n'est pas trouvé, j'envoie un message d'erreur au client et ensuite le client envoie le fichier .class en serveur qui le copie

    merci pour votre aide

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

Discussions similaires

  1. Envoi d'objet avec une socket
    Par HamzuS The Great dans le forum VB.NET
    Réponses: 4
    Dernier message: 06/09/2009, 15h09
  2. Socket (SMTP) vers objet MimeMessage : conversion ?
    Par Loicb dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 06/12/2004, 18h21
  3. [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
  4. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47
  5. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07

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