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