Classe Socket Java

Socket est un élément fondamental de la communication réseau, permettant à différents ordinateurs d'échanger des données sur un réseau.

En Java,java.net.SocketLa classe Socket fournit les fonctionnalités côté client pour mettre en œuvre la communication réseau.

Vous pouvez considérer un Socket comme une connexion entre deux téléphones :

  • Une extrémité est le client (l'appelant)
  • L'autre extrémité est le serveur (la personne qui répond à l'appel)
  • Une fois la connexion établie, les deux parties peuvent s'envoyer et recevoir des informations mutuellement

Utilisation de base de la classe Socket

Création d'une connexion Socket

Pour créer une connexion Socket, vous devez spécifier l'adresse et le port du serveur :

Exemple

try {
    // Se connecter au port 8080 sur localhost
    Socket socket = new Socket("localhost", 8080);
   
    // Utiliser le socket pour la communication...
   
    // Fermer la connexion
    socket.close();
} catch (IOException e) {
    e.printStackTrace();
}

Méthodes principales

La classe Socket fournit plusieurs méthodes importantes :

Méthode Description
getInputStream() Obtenir le flux d'entrée pour recevoir des données
getOutputStream() Obtenir le flux de sortie pour envoyer des données
close() Fermer la connexion Socket
isConnected() Vérifier si la connexion est établie
setSoTimeout(int timeout) Définir le délai d'attente (millisecondes)

Mise en œuvre de la communication client-serveur

Exemple de client

Exemple

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            // 1. Créer une connexion Socket
            Socket socket = new Socket("localhost", 12345);
           
            // 2. Obtenir le flux de sortie et envoyer des données au serveur
            PrintWriter out = new PrintWriter(
                socket.getOutputStream(), true);
            out.println("Hello Server!");
           
            // 3. Obtenir le flux d'entrée et recevoir la réponse du serveur
            BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
            String response = in.readLine();
            System.out.println("Réponse du serveur : " + response);
           
            // 4. Fermer la connexion
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Exemple côté serveur

Du côté serveur, vous devez utiliser laServerSocketclasse ServerSocket :

Exemple

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) {
        try {
            // 1. Créer un ServerSocket et écouter sur le port spécifié
            ServerSocket serverSocket = new ServerSocket(12345);
            System.out.println("Serveur démarré. En attente du client...");
           
            // 2. Attendre une connexion client
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connecté.");
           
            // 3. Obtenir le flux d'entrée et lire le message du client
            BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));
            String message = in.readLine();
            System.out.println("Le client dit : " + message);
           
            // 4. Obtenir le flux de sortie et envoyer une réponse au client
            PrintWriter out = new PrintWriter(
                clientSocket.getOutputStream(), true);
            out.println("Bonjour client !");
           
            // 5. Fermer la connexion
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Fonctionnalités avancées de Socket

Définition des délais d'attente

Exemple

Socket socket = new Socket();
// Définir le délai d'attente de connexion à 5 seconds
socket.connect(new InetSocketAddress("example.com", 80), 5000);
// Définir le délai d'attente de lecture à 3 seconds
socket.setSoTimeout(3000);

Maintien de la connexion active

Exemple

// Activer le mécanisme keep-alive de TCP
socket.setKeepAlive(true);

Taille du tampon

Exemple

// Définir la taille du tampon de réception (bytes)
socket.setReceiveBufferSize(8192);
// Définir la taille du tampon d'envoi (octets)
socket.setSendBufferSize(8192);

Problèmes courants et solutions

Connexion refusée

  • Vérifier si le serveur est en cours d'exécution
  • Confirmer si le numéro de port est correct
  • Vérifier les paramètres du pare-feu

Expiration de la connexion

  • Vérifier la connexion réseau
  • Augmenter le délai d'attente
  • Confirmer si l'adresse du serveur est correcte

Réception de données incomplète

  • S'assurer que les deux parties utilisent le même protocole
  • Vérifiez si la taille du tampon est suffisante
  • Envisagez d'utiliser des délimiteurs ou des messages à longueur fixe

Scénarios d'application pratiques

La programmation par sockets a un large éventail d'applications en pratique :

  • Applications de messagerie instantanée (telles que WeChat, QQ)
  • Jeux en ligne
  • Logiciels de contrôle à distance
  • Outils de transfert de fichiers
  • Communication entre appareils IoT

Bonnes pratiques

  1. Gérez toujours les exceptions d'E/S
  2. Utilisez try-with-resources pour garantir la libération des ressources
  3. Définissez des délais d'attente raisonnables pour les opérations importantes
  4. Envisagez d'utiliser un pool de threads pour gérer plusieurs connexions
  5. Concevoir un protocole de communication clair
Autres extensions