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:
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:
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:
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:
1 2 3 4 5 6
|
package network;
public interface Test {
public String toString();
} |
L'objet est reçu mais j'obtiens cette erreur :
Citation:
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.