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

Langage Java Discussion :

Echange d'objet sur Socket avec Interface


Sujet :

Langage Java

  1. #1
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut Echange d'objet sur Socket avec Interface
    Bonsoir,

    Je viens ici devant vous car je n'arrive pas à faire ce que je veux à propos d'un échange d'objet entre serveur et client Java.

    En effet, j'ai bien réalisé un serveur et un client avec des sockets et cela fonctionne quand j'envoie une instance d'objet mais je dois avoir ma classe serialisé sur le client et sur le serveur. C'est justement ce qui m'embête. Mon serveur ou mon client suivant celui qui envoie ou reçoit n'a pas besoin de connaitre tout le corps de mes classe. Juste les définitions des méthodes.

    Du coup, je me dit que je vais utiliser les interfaces. Mais cela ne fonctionne pas et j'avoue ne pas trop savoir comment faire.

    Pour le moment, dans ma version avec interface j'ai ceci :

    Une classe serveur qui reçoit un objet :
    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
     
    ServerSocket ss = new ServerSocket(port);
     
    			while (true) {
    				Socket clientSocket = ss.accept();
    				System.out.println("NOUVEAU CLIENT");
    				ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
     
     
    				String str;
    				try {
    					System.out.println("ATTEND"+ ois.read());
    					Object o = (Object)ois.readObject();
    				} catch (ClassNotFoundException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    			}
    Une classe 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
     
    Socket clientSocket = null;
    		try {
    			clientSocket = new Socket("localhost", 18000);
     
    			if (clientSocket != null) {
    				// Pour ecrire
    				oos = new ObjectOutputStream( new BufferedOutputStream(clientSocket.getOutputStream()));
     
    				Test test = new Test();
    				test.name = name;
    				System.out.println("OBJET: "+test);
    				oos.writeObject(test);
    			}
     
    		    oos.close();
    			clientSocket.close();
    		}
    Ma classe qui se trouve sur le 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
     
    package network;
     
    import java.io.Serializable;
     
    public class Test implements Serializable {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	public String name;
    	String test1;
     
    	public String toString() {
    		return "["+name+"]";
    	}
    }
    L'interface de ma classe qui se trouve sur le serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    package network;
     
    public interface Test {
    	public String toString();
    }
    L'objet est reçu mais j'obtiens cette erreur :
    Exception encountered on accept. Ignoring. Stack Trace :
    java.io.InvalidClassException: network.Test; network.Test; class invalid for deserialization
    J'aimerais savoir comment organiser mon architecture et utiliser des méthodes me permettant d'utiliser les interfaces sans avoir besoin de RMI. Vous me confirmez aussi qu'il faut que la classe sérialisé soit dans le même package ?

    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Un objet sérialisé ne contient que les données. La JVM a besoin du code des méthodes.
    Tu pourrais par exemple envoyer le .class également, et le charger dans le ClassLoader uniquement si la classe n'est pas présente. Par contre le déchargement n'est pas possible, et plusieurs versions compilées d'une même classe ne peuvent pas cohabiter sur un même ClassLoader. Donc lorsque le client recompile une classe qui peut être envoyée, il faudra redémarrer le serveur.

  3. #3
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    D'accord dinobogan. Du coup je suis obligé de mettre mes classes entière de chaque côté. Cela me semble dans un sens logique. Par contre, au niveau de l'utilisation des interfaces je n'arrive pas à saisir leurs utilités dans l'échange de données entre socket.

    Je ne peux pas utiliser d'interface dans la partie réseau de mon projet JAVA alors ?

    Tu me confirmes ?

    Merci de ton expertise en tout cas.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tu devrais utiliser RMI, ce serait plus simple.

    Tu n'es pas obligé de placer tes classes des deux côtés. Seule l'interface doit être présente des deux côtés.
    Tu vas simplement devoir modifier ton protocole de communication entre le client et le serveur. Lorsque le client envoie un objet sérializé, le serveur va vérifier s'il possède le .class. S'il ne l'a pas, il demande au client le .class et le charge dynamiquement dans le ClassLoader.
    L'implémentation est donc connue du client seul.
    Mais tout ceci revient à réinventer la roue, ou plutôt RMI

  5. #5
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Voilà j'utilise RMI. Mais le problème c'est que je ne sais pas comment enregistrer un client sur mon serveur et encore moins détecter des déconnexions non voulues par le client sur le serveur...

    Ce qui me pose problème car j'ai des traitements à réaliser si un client se déconnecte. Je pensais que cela levait une exception pour détecter une rupture du lien entre client et serveur mais ce n'est pas le cas. Comment identifier des clients ? Avec les sockets on a un identifier de socket mais avec RMI ?...

    Pouvez-vous me donner un petit coup de main ? Je ne maîtrise pas encore RMI...

    Merci d'avance

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

Discussions similaires

  1. Insertion de données sur sql avec interface graphique
    Par stvv10 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 19/06/2015, 23h25
  2. lire sur une socket avec Qt
    Par lilmeth dans le forum Qt
    Réponses: 6
    Dernier message: 06/04/2009, 22h20
  3. [PERL] Lecture bufferisé sur socket avec sysread
    Par yum_yum dans le forum Langage
    Réponses: 0
    Dernier message: 02/09/2008, 15h01
  4. Réponses: 8
    Dernier message: 12/07/2008, 12h29
  5. Lecture non bloquante sur plusieurs Sockets avec nio
    Par ratakses dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 19/04/2007, 16h14

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