Communication client / sever via socket tcp

Exemple

package fr.dyma;

import fr.dyma.model.Article;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.OffsetDateTime;

/**
 * Les sockets ont pour particularité de maintenir la connexion entre le client et le serveur
 * et tant que la connexion n'a pas été explicitement fermée (ou tant qu'il n'y a pas eu de coupure réseau).
 * Dans cet exemple, nous avons un échange de flux d'octets entre client et server. Ce dernier récupère les données en octest
 * issues du client et le transfomrme en objet Article via sa méthode de socket -> getInputStream()
 * puis retourne une réponse en octets au client avec socket -> getOutputStream()
 */
public class ServerTcp {
    public final static Logger logger = LogManager.getLogger(ServerTcp.class);
    public final static int PORT = 9630;

    public static void main(String[] args) {

        try (ServerSocket socketServeur = new ServerSocket(PORT)) {
            logger.info("Lancement du serveur TCP");
            while (true) {
                Socket socketClient = socketServeur.accept();
                // Démarrage d'un nouveau thread avec l'interface Runnable
                Runnable socketThread = () -> {
                    try {
                        processThread(socketClient);
                    } catch (ClassNotFoundException | IOException e) {
                        e.printStackTrace();
                    }
                };
                socketThread.run();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void processThread(Socket socketClient) throws ClassNotFoundException, IOException {
        logger.info("Connexion avec : " + socketClient.getInetAddress());
        readClientInput(socketClient);
        sendResponse(socketClient);
    }

    private static void readClientInput(Socket socketClient) throws IOException, ClassNotFoundException {
        var in = new ObjectInputStream(socketClient.getInputStream());
        Article article = (Article) in.readObject();
        logger.info("Lecture de l'article venant du client : " + article);
    }

    private static void sendResponse(Socket socketClient) throws IOException {
        var articleOut = new Article("article out", "Le serveur fonctionne !", ":)", OffsetDateTime.now());
        var out = new ObjectOutputStream(socketClient.getOutputStream());
        out.writeObject(articleOut);
    }
}Langage du code : Java (java)

package fr.dyma;

import fr.dyma.model.Article;
import fr.dyma.service.LogService;
import fr.dyma.service.impl.LogServiceImpl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class ClientTcp {
    public final static LogService logService = new LogServiceImpl();
    public static final Logger logger = LogManager.getLogger(ClientTcp.class);

    public static void main(String[] args) {
        // Test écriture log dans fichier client.log
        logService.logging();

        try {
            var serveur = InetAddress.getByName("localhost");
            var socket = new Socket(serveur, ServerTcp.PORT);
            sendRequest(socket);
            readServerResponse(socket);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static void sendRequest(Socket socket) throws IOException {
        var out = new ObjectOutputStream(socket.getOutputStream());
        logger.info("Envoi d'un article au serveur...");
        var articleClient = new Article("article client", "Coucou du client !", ":D", null);
        out.writeObject(articleClient);
        logger.info("Article envoyé !");
    }

    private static void readServerResponse(Socket socket) throws IOException, ClassNotFoundException {
        var in = new ObjectInputStream(socket.getInputStream());
        Article article = (Article) in.readObject();
        logger.info("Lecture de l'article venant du serveur : " + article);
    }
}Langage du code : Java (java)