Programmation réseau Java

La programmation réseau désigne l'écriture de programmes qui s'exécutent sur plusieurs appareils (ordinateurs), tous connectés via un réseau.

Les API J2SE du paquet java.net contiennent des classes et des interfaces qui fournissent les détails de communication de bas niveau. Vous pouvez utiliser directement ces classes et interfaces pour vous concentrer sur la résolution des problèmes sans vous soucier des détails de communication.

Le paquet java.net prend en charge deux protocoles réseau courants :

  • TCP: TCP (Transmission Control Protocol) est un protocole de communication de la couche transport orienté connexion, fiable et basé sur un flux d'octets. La couche TCP est une couche intermédiaire située au-dessus de la couche IP et en dessous de la couche application. TCP garantit une communication fiable entre deux applications. Il est couramment utilisé pour les protocoles Internet et est appelé TCP/IP.

  • UDP: UDP (User Datagram Protocol) se situe au niveau de la couche transport du modèle OSI. Il s'agit d'un protocole sans connexion. Il fournit des datagrammes pour envoyer des données entre applications. Étant donné qu'UDP manque de fiabilité et est un protocole sans connexion, les applications doivent généralement tolérer certains paquets perdus, erronés ou dupliqués.

Ce tutoriel explique principalement les deux sujets suivants.

  • Programmation de sockets: C'est le concept de mise en réseau le plus largement utilisé, et il a été expliqué de manière très détaillée.

  • Traitement des URL: Cette partie sera abordée dans une section distincte. Cliquez ici pour en savoir plus surla gestion des URL dans le langage Java.。


Programmation de sockets

Les sockets utilisent TCP pour fournir un mécanisme de communication entre deux ordinateurs. Un programme client crée une socket et tente de se connecter à la socket du serveur.

Lorsque la connexion est établie, le serveur crée un objet Socket. Le client et le serveur peuvent maintenant communiquer en écrivant dans les objets Socket et en lisant depuis ces objets.

La classe java.net.Socket représente une socket, et la classe java.net.ServerSocket fournit un mécanisme permettant aux programmes serveur d'écouter les clients et d'établir des connexions avec eux.

Les étapes suivantes se produisent lors de l'établissement d'une connexion TCP entre deux ordinateurs à l'aide de sockets :

  • Le serveur instancie un objet ServerSocket, indiquant une communication via un port sur le serveur.

  • Le serveur appelle la méthode accept() de la classe ServerSocket, qui attendra qu'un client se connecte au port donné sur le serveur.

  • Pendant que le serveur attend, un client instancie un objet Socket, en spécifiant le nom du serveur et le numéro de port pour demander une connexion.

  • Le constructeur de la classe Socket tente de connecter le client au serveur et au numéro de port spécifiés. Si la communication est établie, un objet Socket capable de communiquer avec le serveur est créé sur le client.

  • Du côté du serveur, la méthode accept() renvoie une nouvelle référence de socket sur le serveur, qui est connectée à la socket du client.

Une fois la connexion établie, la communication s'effectue à l'aide de flux d'E/S. Chaque socket possède un flux de sortie et un flux d'entrée. Le flux de sortie du client se connecte au flux d'entrée du serveur, tandis que le flux d'entrée du client se connecte au flux de sortie du serveur.

TCP est un protocole de communication bidirectionnel, de sorte que les données peuvent être envoyées simultanément sur les deux flux de données. Voici quelques classes qui fournissent un ensemble complet de méthodes utiles pour implémenter des sockets.


Méthodes de la classe ServerSocket

Les applications serveur utilisent la classe java.net.ServerSocket pour obtenir un port et écouter les requêtes des clients.

La classe ServerSocket possède quatre constructeurs :

Non. Description de la méthode
1 public ServerSocket(int port) throws IOException
Crée une socket serveur liée à un port spécifique.
2 public ServerSocket(int port, int backlog) throws IOException
Crée une socket serveur avec le backlog spécifié et la lie au numéro de port local spécifié.
3 public ServerSocket(int port, int backlog, InetAddress address) throws IOException
Crée un serveur en utilisant le port spécifié, le backlog d'écoute et l'adresse IP locale à laquelle se lier.
4 public ServerSocket() throws IOException
Crée une socket serveur non liée.

Crée une socket serveur non liée. Si le constructeur de ServerSocket ne lève pas d'exception, cela signifie que votre application s'est correctement liée au port spécifié et écoute les requêtes des clients.

Voici quelques méthodes courantes de la classe ServerSocket :

Non. Description de la méthode
1 public int getLocalPort()
Renvoie le port sur lequel cette socket écoute.
2 public Socket accept() throws IOException
Écoute et accepte les connexions à cette socket.
3 public void setSoTimeout(int timeout)
Active/désactive SO_TIMEOUT avec la valeur de délai spécifiée, en millisecondes.
4 public void bind(SocketAddress host, int backlog)
Lie le ServerSocket à une adresse spécifique (adresse IP et numéro de port).

Méthodes de la classe Socket

La classe java.net.Socket représente la socket utilisée à la fois par le client et le serveur pour communiquer entre eux. Le client obtient un objet Socket en l'instanciant, tandis que le serveur obtient un objet Socket via la valeur de retour de la méthode accept().

La classe Socket possède cinq constructeurs.

Non. Description de la méthode
1 public Socket(String host, int port) throws UnknownHostException, IOException.
Crée une socket de flux et la connecte au numéro de port spécifié sur l'hôte spécifié.
2 public Socket(InetAddress host, int port) throws IOException
Crée une socket de flux et la connecte au numéro de port spécifié sur l'adresse IP spécifiée.
3 public Socket(String host, int port, InetAddress local, int localPort) throws IOException.
Crée une socket et la connecte au port distant spécifié sur l'hôte distant spécifié.
4 public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException
Crée une socket et la connecte au port distant spécifié sur l'adresse distante spécifiée.
5 public Socket()
Crée une socket non connectée en utilisant le type SocketImpl par défaut du système.

Lorsque le constructeur Socket retourne, il n'instancie pas simplement un objet Socket ; il tente en fait de se connecter au serveur et au port spécifiés.

Quelques méthodes intéressantes sont listées ci-dessous. Notez que le client et le serveur possèdent tous deux un objet Socket, donc le client comme le serveur peuvent appeler ces méthodes.

Non. Description de la méthode
1 public void connect(SocketAddress host, int timeout) throws IOException
Connecte ce socket au serveur et spécifie une valeur de délai d'attente.
2 public InetAddress getInetAddress()
Renvoie l'adresse à laquelle ce socket est connecté.
3 public int getPort()
Renvoie le port distant auquel ce socket est connecté.
4 public int getLocalPort()
Renvoie le port local auquel ce socket est lié.
5 public SocketAddress getRemoteSocketAddress()
Renvoie l'adresse du point de terminaison auquel ce socket est connecté, ou null s'il n'est pas connecté.
6 public InputStream getInputStream() throws IOException
Renvoie le flux d'entrée de cette socket.
7 public OutputStream getOutputStream() throws IOException
Renvoie le flux de sortie de cette socket.
8 public void close() throws IOException
Ferme cette socket.

Méthodes de la classe InetAddress

Cette classe représente une adresse Internet Protocol (IP). La liste suivante présente quelques méthodes utiles pour la programmation de sockets :

Non. Description de la méthode
1 static InetAddress getByAddress(byte[] addr)
Renvoie un objet InetAddress à partir de l'adresse IP brute.
2 static InetAddress getByAddress(String host, byte[] addr)
Crée un InetAddress à partir du nom d'hôte et de l'adresse IP fournis.
3 static InetAddress getByName(String host)
Détermine l'adresse IP d'un hôte à partir du nom d'hôte.
4 String getHostAddress() 
Renvoie la chaîne d'adresse IP (sous forme textuelle).
5 String getHostName() 
Obtient le nom d'hôte pour cette adresse IP.
6 static InetAddress getLocalHost()
Renvoie l'hôte local.
7 String toString()
Convertit cette adresse IP en String.

Exemple de client Socket

Le GreetingClient suivant est un programme client qui se connecte à un serveur via un socket, envoie une requête, puis attend une réponse.

Code du fichier GreetingClient.java :

//Nom du fichier : GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connexion à l'hôte:" + serverName + ", numéro de port:" + port); Socket client = new Socket(serverName, port); System.out.println("Adresse de l'hôte distant:" + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Bonjour de " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Réponse du serveur :" + in.readUTF()); client.close(); }catch(IOException e) { e.printStackTrace(); } } }

Exemple de serveur Socket

Le programme GreetingServer suivant est une application côté serveur qui utilise un Socket pour écouter sur un port spécifié.

Code du fichier GreetingServer.java :

//Nom du fichier : GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("En attente d'une connexion distante, numéro de port :" + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Adresse de l'hôte distant :" + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Merci de vous être connecté à moi :" + server.getLocalSocketAddress() + "\nAu revoir !"); server.close(); }catch(SocketTimeoutException s) { System.out.println("Socket timed out!"); break; }catch(IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.run(); }catch(IOException e) { e.printStackTrace(); } } }

Compilez les codes des deux fichiers Java ci-dessus, puis exécutez les commandes suivantes pour démarrer le service en utilisant le numéro de port 6066 :

$ javac GreetingServer.java 
$ java GreetingServer 6066
等待远程连接,端口号为:6066...

Ouvrez une nouvelle fenêtre de commande et exécutez la commande ci-dessus pour démarrer le client :

$ javac GreetingClient.java 
$ java GreetingClient localhost 6066
连接到主机:localhost ,端口号:6066
远程主机地址:localhost/127.0.0.1:6066
服务器响应: 谢谢连接我:/127.0.0.1:6066
Goodbye!
Autres extensions