Java : Sérialisation et désérialisation avec les sockets
Objet Serializable
Pour sérialiser et désérialiser un objet, il faut que la classe implémente l'interface Serializable.
Imaginons la classe Product avec un nom et un prix.
import java.io.Serializable;
public class Product implements Serializable {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Product [name=" + name + ", price=" + price + "]";
}
}
C'est un POJO assez classique. Les accesseurs et les mutateurs n'ont pas été créés pour plus de clarté. Remarquez que cette classe implémente Serializable.
Cette classe devra être créé côté client et côté serveur.
Côté serveur
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
//On crée une ServerSocket et on attend une connexion
ServerSocket serverSocket = new ServerSocket(3000);
Socket clientSocket = serverSocket.accept();
//On prend le flux d'entrée du client
ObjectInputStream oin = new ObjectInputStream(clientSocket.getInputStream());
//On lit l'objet que le client envoie
Product product = (Product) oin.readObject();
System.out.println(product);
//On ferme les sockets
clientSocket.close();
serverSocket.close();
}
}
La fonction accept() est bloquante. Elle attend qu'un client se connecte sur le socket.
La méthode accept() retourne ensuite le socket du client. On peut ensuite prendre le flux d'entrée du client grâce à la méthode getInputStream() et de le transformer en ObjectInputStream pour nous permettre d'appeler la fonction readObject() qui nous retourne l'objet product envoyé par le client.
Côté client
import java.io.ObjectOutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
// On crée une socket sur à l'adresse 127.0.0.1 port 3000
Socket socket = new Socket("127.0.0.1", 3000);
//On prend le flux de sortie de la socket (client)
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
Product product = new Product("table", 200);
//On envoie l'objet
oos.writeObject(product);
//On ferme la socket (client)
socket.close();
}
}
Côté client, on prend le flux de sortie pour envoyer l'objet.
Pensez à bien démarrer le serveur avant le client.
Commentaires
Enregistrer un commentaire