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 :

Passage d'objet via socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut Passage d'objet via socket
    Bonjour,
    J'essaye depuis un petit moment de développer un truc peut être un peu tordu mais qui me permettrait de faire énormément de choses derrière.

    -J'ai un serveur qui attend une connexion, une fois celle-ci établie il envoie un properties au client puis attend un objet.
    -J'ai un client qui se connecte à un serveur, demande au client de choisir un jar sur le disque, récupère un fichier de configuration lui correspondant sur le serveur. Instancie ce jar (la classe qui est instancié dans le jar implémente une interface que le serveur ET le client partagent)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static ImonObjet loadClass(File file, Properties param) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException{
            URL url = file.toURI().toURL();
            URL[] urls = new URL[]{url};
            ClassLoader cl = new URLClassLoader(urls);
            Class cls = cl.loadClass("MonPackage.MonObjet");
            ImonObjet iobj=null;
            iobj = (ImonObjet) cls.getConstructors()[0].newInstance(param );
            return iobj;
        }
    Ce code fonctionne parfaitement cotés client et mon objet est instancié comme il faut et référencé via l'interface qu'elle étend.
    Apres ça le client envoie cette objet au serveur via un objectoutputstream et le serveur le récupère donc via objectinputstream.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImonObjet obj = (ImonObjet ) ois.readObject();
    mais j'obtient une exception: classnotfound.
    En parlant avec d'autres programmeurs ils me disent que en théorie ça devrait fonctionner mais voila...
    Il faut peut être que je charge la classe avant? mais comment vu que e fichier n'est pas sur le serveur (et que j'ai pas vraiment envie de l'y placer).

    bref, si quelqu'un a une idée de comment faire sa réponse sera la bienvenue




    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
    java.lang.ClassNotFoundException: MonPackage.MonObjet
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Class.java:266)
    	at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:623)
    	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1610)
    	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
    	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    	at serveur.TraitementClient.connection(TraitementClient.java:77)
    	at serveur.TraitementClient.run(TraitementClient.java:54)
    	at java.lang.Thread.run(Thread.java:722)

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par kranagard Voir le message
    En parlant avec d'autres programmeurs ils me disent que en théorie ça devrait fonctionner mais voila...
    Je pense que tu ne leur as pas raconté toute l'histoire.

    Tu nous dis que la classe implémente une interface qui est partagée par le serveur et le client. Mais si on utilise la sérialisation avec ObjectOutputStream, on s'en fout. C'est la classe, et toute son ascendance, qui doivent être partagées par le serveur et le client.

    Le serveur doit donc posséder toutes les classes dont un client peut possiblement lui envoyer une instance.
    Ou alors, chercher une autre organisation. La sérialisation Java, malheureusement, supporte mal les changements : une ancienne version aura du mal à communiquer avec une nouvelle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut
    Je vais devoir transférer le jar du client vers le serveur et instancier mon objet côtes serveur dans ce cas?

    Je voulais éviter la création de fichier temporaire cotés serveur à la base mais je viens de penser à un truc qui pourrait me permetre de le mettre enplace assez simplement finalement...

    Pour toi il n'y a pas d'autre solution donc?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par kranagard Voir le message
    Je vais devoir transférer le jar du client vers le serveur et instancier mon objet côtes serveur dans ce cas?
    Ma foi c'est une possibilité mais c'est, comment dire... Bourrin.

    Citation Envoyé par kranagard Voir le message
    Pour toi il n'y a pas d'autre solution donc?
    Ah si, plein. Il n'est absolument pas utile de charger des classes pour transmettre des données. De simples String ou byte[] font amplement l'affaire.

    Transmettre des classes, c'est pour le cas où ce n'est pas des données qu'on veut transmettre, mais un comportement. Un comportement trop complexe et évolutif pour juste dire "bah comportement A, ou comportement B, ou comportement C."
    Et je ne parle pas de la sécurité. Tu fais quoi si un de tes clients t'envoie une classe qui efface tous les fichiers, vide la base de données et déclenche une fork bomb ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Par défaut
    C'est justement un comportement que je veux transférer, les données sont transférée depuis le serveur pour les instancier.

    Je vais réfléchir mais cotés client je verifie déjà ce que contient le jar que je charge donc je peux blinder de ce côtes si besoin.

    Ne puis je pas réduire les droit du thread par rapport aux autres?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par kranagard Voir le message
    Ne puis je pas réduire les droit du thread par rapport aux autres?
    Si mais cela n'empêchera pas certaines choses, comme une boucle infinie qui consommera un thread et du CPU éternellement. Cela peut être mitigé en créant un nouveau process pour lancer le code "externe" et en le tuant s'il abuse.

    Mais tout cela devient très compliqué. Après, si vraiment tu as besoin de transmettre un vrai comportement non-trivial, bah, t'as pas trop le choix. Il existe peut-être des solutions pro qui simplifient le tout, ce n'est pas mon domaine.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Envoyer un Objet via Socket
    Par t4rik9 dans le forum Langage
    Réponses: 3
    Dernier message: 17/11/2014, 02h03
  2. Réponses: 5
    Dernier message: 22/05/2012, 16h18
  3. Envoyer un objet via Socket UDP
    Par lastico21000 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 11/02/2012, 14h58
  4. Transfert d'objet via sockets
    Par benjamin-mermoz dans le forum Windows Forms
    Réponses: 5
    Dernier message: 11/12/2008, 21h34
  5. [ JSP ][ Débutant ] Passage d'objet par un forward
    Par captainpouet dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/04/2004, 10h33

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