Java - Classe Socket avec Exemples

Bonjour, futurs programmeurs Java ! Aujourd'hui, nous allons entreprendre un voyage passionnant dans le monde du programmement réseau en utilisant la classe Socket de Java. En tant que votre professeur de science informatique bien-aimé, je suis ravi de vous guider à travers cette aventure. Ne vous inquiétez pas si vous êtes nouveau dans la programmation - nous allons commencer par les bases et progresser pas à pas. Alors, mettez vos casques virtuels, et plongeons dedans !

Java - Socket Class

Qu'est-ce qu'un Socket ?

Avant de plonger dans le code, comprens ce qu'est un socket. Imaginez que vous essayez d'appeler votre ami au téléphone. Vous avez besoin de deux choses : le numéro de téléphone de votre ami et un téléphone pour passer l'appel. En réseautage informatique, un socket est comme ce téléphone - c'est le point de terminaison d'un lien de communication bidirectionnel entre deux programmes s'exécutant sur un réseau.

Classe Socket en Java

La classe Socket de Java représente un socket côté client. Elle fait partie du paquet java.net et offre un moyen pour les programmes de communiquer avec d'autres programmes sur un réseau.

Déclaration

Pour utiliser la classe Socket, vous devez d'abord l'importer :

import java.net.Socket;

Constructeurs

La classe Socket a plusieurs constructeurs. Voici les plus couramment utilisés :

Constructeur Description
Socket() Crée un socket non connecté
Socket(String host, int port) Crée un socket et le connecte à l'hôte et au port spécifiés
Socket(InetAddress address, int port) Crée un socket et le connecte à l'adresse IP et au port spécifiés

Méthodes

La classe Socket offre diverses méthodes pour gérer les connexions et transférer des données. Voici quelques-unes des plus importantes :

Méthode Description
connect(SocketAddress endpoint) Connecte ce socket au serveur
getInputStream() Retourne un flux d'entrée pour lire des octets à partir de ce socket
getOutputStream() Retourne un flux de sortie pour écrire des octets dans ce socket
close() Ferme ce socket
isClosed() Retourne si le socket est fermé ou non
isConnected() Retourne si le socket est connecté ou non

Exemple de Client Socket

Maintenant, créons un client simple qui se connecte à un serveur et envoie un message. Ne vous inquiétez pas si vous ne comprenez pas tout de suite - nous allons le décomposer étape par étape.

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

public class SimpleSocketClient {
public static void main(String[] args) {
try {
// Créer un socket et se connecter au serveur
Socket socket = new Socket("localhost", 12345);
System.out.println("Connecté au serveur !");

// Créer un flux de sortie pour envoyer des données au serveur
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

// Envoyer un message au serveur
out.println("Bonjour, Serveur ! Voici un message du client.");

// Créer un flux d'entrée pour recevoir des données du serveur
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// Lire la réponse du serveur
String response = in.readLine();
System.out.println("Le serveur dit : " + response);

// Fermer les connexions
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Décomposons cela :

  1. Nous commençons par importer les classes nécessaires pour les opérations d'entrée/sortie et le réseautage.

  2. Dans la méthode main, nous enveloppons notre code dans un bloc try-catch pour gérer les potentiels IOExceptions.

  3. Nous créons un nouvel objet Socket, spécifiant l'adresse du serveur ("localhost" dans ce cas, ce qui signifie la même machine) et le numéro de port (12345).

  4. Nous créons un PrintWriter pour envoyer des données au serveur via le flux de sortie du socket.

  5. Nous envoyons un message au serveur en utilisant la méthode println.

  6. Nous créons un BufferedReader pour recevoir des données du serveur via le flux d'entrée du socket.

  7. Nous lisons la réponse du serveur en utilisant la méthode readLine et l'affichons.

  8. Enfin, nous fermons tous les flux et le socket pour libérer les ressources.

Maintenant, vous vous demandez peut-être : "Mais attendez, où est le serveur ?" Excellent question ! Pour que ce client fonctionne, nous avons besoin d'un serveur en écoute sur le même port. Créons un serveur simple pour compléter notre exemple.

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

public class SimpleSocketServer {
public static void main(String[] args) {
try {
// Créer un socket serveur
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("Le serveur attend le client...");

// Attendre qu'un client se connecte
Socket clientSocket = serverSocket.accept();
System.out.println("Client connecté !");

// Créer un flux d'entrée pour recevoir des données du client
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

// Créer un flux de sortie pour envoyer des données au client
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

// Lire le message du client
String message = in.readLine();
System.out.println("Le client dit : " + message);

// Envoyer une réponse au client
out.println("Message reçu, merci !");

// Fermer les connexions
in.close();
out.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Ce code du serveur fait ce qui suit :

  1. Crée un ServerSocket sur le port 12345.
  2. Attend qu'un client se connecte en utilisant la méthode accept.
  3. Une fois qu'un client se connecte, il crée des flux d'entrée et de sortie.
  4. Lit le message du client et l'affiche.
  5. Envoie une réponse au client.
  6. Ferme toutes les connexions.

Pour exécuter cet exemple :

  1. D'abord, exécutez la classe SimpleSocketServer.
  2. Ensuite, exécutez la classe SimpleSocketClient.

Vous devriez voir le client se connecter au serveur, envoyer un message et recevoir une réponse !

Conclusion

Félicitations ! Vous venez de créer votre première application client-serveur en utilisant les sockets Java. Cela n'est que la pointe de l'iceberg en matière de programmation réseau, mais c'est un excellent début.

Souvenez-vous, les sockets sont comme des téléphones - ils permettent aux programmes de communiquer entre eux sur un réseau. Avec cette connaissance, vous pouvez commencer à construire des applications réseaux plus complexes, comme des programmes de chat, des jeux multijoueurs ou des systèmes distribués.

Alors continuez à pratiquer, restez curieux, et bon codage !

Credits: Image by storyset