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 :
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
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(); } }
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
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(); }
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
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'objet est reçu mais j'obtiens cette erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 package network; public interface Test { public String toString(); }
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 ?Exception encountered on accept. Ignoring. Stack Trace :
java.io.InvalidClassException: network.Test; network.Test; class invalid for deserialization
Merci d'avance de votre aide.
Partager