English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Java

Contrôle du flux Java

Java Tableau

Java Programmation orientée objet (I)

Java Programmation orientée objet (II)

Java Programmation orientée objet (III)

Gestion des exceptions Java

Java Liste (List)

Java Queue (file d'attente)

Java Map de collections

Java Set de collections

Java Entrée/Sortie (I/O)/O)

Java Reader/Writer

Autres sujets Java

Java network programming

La programmation réseau consiste à écrire des programmes qui s'exécutent sur plusieurs appareils (ordinateurs) connectés ensemble via un réseau.

J2Les API de SE contiennent des classes et des interfaces qui fournissent des 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 fournit le support pour deux protocoles réseau courants :

  • TCP:TCP (Transmission Control Protocol, protocole de contrôle de transmission) est un protocole de communication de couche de transport orienté connexion, fiable et basé sur un flux de octets. La couche TCP est située entre la couche IP et la couche applicative. TCP garantit une communication fiable entre deux applications. Il est généralement utilisé dans les protocoles IP, et est appelé TCP. / IP.

  • UDP:UDP (User Datagram Protocol, protocole de datagramme utilisateur), se situe au niveau de la couche de transport du modèle OSI. Un protocole sans connexion. Fournit des datagrammes pour que les applications puissent envoyer des données. En raison du manque de fiabilité de UDP et de son caractère sans connexion, les applications doivent généralement permettre certaines pertes, erreurs ou répétitions de paquets.

Ce tutoriel traite principalement des deux sujets suivants.

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

  • Traitement des URL:Cette partie sera expliquée dans un autre article, cliquez ici pour en savoir plus sur Traitement des URL en Java.

Programmation Socket

Les sockets utilisent TCP pour fournir un mécanisme de communication entre deux ordinateurs. Le programme client crée un socket et tente de se connecter au 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 et en lisant sur l'objet Socket.

La classe java.net.Socket représente un socket et la classe java.net.ServerSocket fournit un mécanisme pour le programme serveur pour écouter les clients et é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 pour représenter la communication par le port sur le serveur.

  • Le serveur appelle la méthode accept() de la classe ServerSocket, qui attendra jusqu'à ce que le client se connecte au port spécifié sur le serveur.

  • Lorsque le serveur attend, un client instancie un objet Socket, spécifie le nom du serveur et le port pour demander une connexion.

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

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

Après l'établissement de la connexion, utilisez I/Dans la communication par flux O, chaque socket a un flux de sortie et un flux d'entrée. Le flux de sortie du client est connecté au flux d'entrée du serveur, et le flux d'entrée du client est connecté au flux de sortie du serveur.

TCP est un protocole de communication bidirectionnelle, donc les données peuvent être envoyées par deux flux de données en même temps. Voici un ensemble complet de méthodes utiles fournies par les classes pour implémenter le socket.

Les méthodes de la classe ServerSocket

L'application serveur utilise la classe java.net.ServerSocket pour obtenir un port et écouter les demandes des clients.

La classe ServerSocket a quatre constructeurs :

NuméroDescription de la méthode
1public ServerSocket(int port) throws IOException
Créer un socket serveur lié à un port spécifique.
2public ServerSocket(int port, int backlog) throws IOException
Créer un socket serveur spécifié par le backlog et le lier au port local spécifié.
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
Créer un serveur en utilisant le port spécifié, le backlog et l'adresse IP locale à laquelle il doit être lié.
4public ServerSocket() throws IOException
Créez un serveur socket non lié.

Créez un serveur socket non lié. Si le constructeur ServerSocket ne lance pas d'exception, cela signifie que votre application s'est déjà connectée avec succès au port spécifié et écoute les demandes de clients.

Voici quelques méthodes couramment utilisées de la classe ServerSocket :

NuméroDescription de la méthode
1public int getLocalPort()
  Retourne le port sur lequel ce socket écoute.
2public Socket accept() throws IOException
Écoutez et acceptez la connexion à ce socket.
3public void setSoTimeout(int timeout)
 Activez via une valeur de délai d'attente spécifiée/Désactivez SO_TIMEOUT en millisecondes.
4public void bind(SocketAddress host, int backlog)
Liez le ServerSocket à une adresse spécifique (adresse IP et port).

Méthodes de la classe Socket

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

La classe Socket a cinq constructeurs.

NuméroDescription de la méthode
1public Socket(String host, int port) throws UnknownHostException, IOException.
Créez un socket de flux et connectez-le au port spécifié de l'hôte.
2public Socket(InetAddress host, int port) throws IOException
Créez un socket de flux et connectez-le au port spécifié de l'adresse IP.
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
Créez un socket et connectez-le au port distant spécifié sur l'hôte distant.
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
Crée un socket et le connecte au port distant spécifié de l'adresse distante spécifiée.
5public Socket()
Crée un socket non connecté via le SocketImpl par défaut du système

Lorsque la méthode constructeur Socket retourne, et qu'un exemple simple d'instanciation d'un objet Socket a été donné, il essaie en réalité de se connecter au serveur et au port spécifiés.

Voici une liste de méthodes intéressantes, notez que tant le client que le serveur ont un objet Socket, donc que ce soit le client ou le serveur, ils peuvent appeler ces méthodes.

NuméroDescription de la méthode
1public void connect(SocketAddress host, int timeout) throws IOException
Connecte ce socket au serveur et spécifie une valeur de délai d'attente.
2public InetAddress getInetAddress()
 Retourne l'adresse connectée du socket.
3public int getPort()
Retourne le port distant auquel ce socket est connecté.
4public int getLocalPort()
Retourne le port local auquel ce socket est lié.
5public SocketAddress getRemoteSocketAddress()
Retourne l'adresse de l'extrémité de connexion du socket, ou null si non connecté.
6public InputStream getInputStream() throws IOException
Retourne le flux d'entrée de ce socket.
7public OutputStream getOutputStream() throws IOException
Retourne le flux de sortie de ce socket.
8public void close() throws IOException
Ferme ce socket.

Méthodes de la classe InetAddress

Cette classe représente une adresse IP (IP) Internet. Voici une liste des méthodes utiles pour la programmation Socket :

NuméroDescription de la méthode
1static InetAddress getByAddress(byte[] addr)
Dans le cas d'une adresse IP originale donnée, retourne l'objet InetAddress.
2static InetAddress getByAddress(String host, byte[] addr)
Crée InetAddress en fonction du nom d'hôte et de l'adresse IP fournis.
3static InetAddress getByName(String host)
Détermine l'adresse IP de l'hôte pour un nom d'hôte donné.
4String getHostAddress() 
Renvoie une chaîne d'adresse IP (représentée sous forme de texte).
5String getHostName() 
 Obtient le nom d'hôte de cette adresse IP.
6static InetAddress getLocalHost()
Renvoie l'hôte local.
7String toString()
Convertir cette adresse IP en String.

Exemple de client Socket

Le GreetingClient suivant est un programme client, qui se connecte au serveur via socket pour envoyer une requête et attend une réponse.

// 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 + ", le port : "} + port);
         Socket client = new Socket(serverName, port);
         System.out.println("远程主机地址:" + 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();
      }
   }
}

Socket 服务端示例

以下 GreetingServer 程序是一个服务器端应用程序,使用 Socket 来监听一个指定的端口。

// 文件名 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("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
            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();
      }
   }
}

Compile the above two java files and execute the following command to start the service, using port 6066:

$ javac GreetingServer.java 
$ java GreetingServer 6066
Waiting for remote connection, port:6066...

Open a new command window and execute the following commands to start the client:

$ javac GreetingClient.java 
$ java GreetingClient localhost 6066
Connecting to host: localhost, port:6066
Remote host address: localhost/127.0.0.1:6066
Server response: Thank you for connecting to me:/127.0.0.1:6066
Goodbye!