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();
}
// 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();
}
}
}
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();
}
}
}
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);
// 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);
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);
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
- Gérez toujours les exceptions d'E/S
- Utilisez try-with-resources pour garantir la libération des ressources
- Définissez des délais d'attente raisonnables pour les opérations importantes
- Envisagez d'utiliser un pool de threads pour gérer plusieurs connexions
- Concevoir un protocole de communication clair