Java - Réseau

Le terme programmation réseau fait référence à l'écriture de programmes qui s'exécutent sur plusieurs appareils (ordinateurs), dans lesquels les appareils sont tous connectés les uns aux autres à l'aide d'un réseau.

Le package java.net des API J2SE contient une collection de classes et d'interfaces qui fournissent les détails de communication de bas niveau, vous permettant d'écrire des programmes qui se concentrent sur la résolution du problème.

Le package java.net prend en charge les deux protocoles réseau courants -

  • TCP- TCP signifie Transmission Control Protocol, qui permet une communication fiable entre deux applications. TCP est généralement utilisé sur le protocole Internet, appelé TCP / IP.

  • UDP - UDP signifie User Datagram Protocol, un protocole sans connexion qui permet la transmission de paquets de données entre les applications.

Ce chapitre donne une bonne compréhension des deux sujets suivants -

  • Socket Programming - C'est le concept le plus largement utilisé en réseautage et il a été expliqué en détail.

  • URL Processing- Cela serait couvert séparément. Cliquez ici pour en savoir plus sur le traitement des URL en langage Java.

Programmation de socket

Les sockets fournissent le mécanisme de communication entre deux ordinateurs utilisant TCP. Un programme client crée un socket à sa fin de la communication et tente de connecter ce socket à un serveur.

Lorsque la connexion est établie, le serveur crée un objet socket à sa fin de la communication. Le client et le serveur peuvent désormais communiquer en écrivant et en lisant à partir du socket.

La classe java.net.Socket représente une socket et la classe java.net.ServerSocket fournit un mécanisme permettant au programme 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 le numéro de port sur lequel la communication doit avoir lieu.

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

  • Une fois le serveur en attente, un client instancie un objet Socket, en spécifiant le nom du serveur et le numéro de port auquel se connecter.

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

  • Côté serveur, la méthode accept () renvoie une référence à un nouveau socket sur le serveur qui est connecté au socket du client.

Une fois les connexions établies, la communication peut avoir lieu à l'aide de flux d'E / S. Chaque socket a à la fois un OutputStream et un InputStream. OutputStream du client est connecté à InputStream du serveur, et InputStream du client est connecté à OutputStream du serveur.

TCP est un protocole de communication bidirectionnel, par conséquent les données peuvent être envoyées sur les deux flux en même temps. Voici les classes utiles fournissant un ensemble complet de méthodes pour implémenter les sockets.

Méthodes de classe ServerSocket

le java.net.ServerSocket La classe est utilisée par les applications serveur pour obtenir un port et écouter les demandes des clients.

La classe ServerSocket a quatre constructeurs -

Sr.No. Méthode et description
1

public ServerSocket(int port) throws IOException

Tente de créer un socket serveur lié au port spécifié. Une exception se produit si le port est déjà lié par une autre application.

2

public ServerSocket(int port, int backlog) throws IOException

Similaire au constructeur précédent, le paramètre backlog spécifie le nombre de clients entrants à stocker dans une file d'attente.

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

Semblable au constructeur précédent, le paramètre InetAddress spécifie l'adresse IP locale à laquelle se lier. InetAddress est utilisé pour les serveurs qui peuvent avoir plusieurs adresses IP, ce qui permet au serveur de spécifier sur laquelle de ses adresses IP accepter les demandes des clients.

4

public ServerSocket() throws IOException

Crée un socket serveur indépendant. Lorsque vous utilisez ce constructeur, utilisez la méthode bind () lorsque vous êtes prêt à lier le socket serveur.

Si le constructeur ServerSocket ne lève pas d'exception, cela signifie que votre application s'est liée avec succès au port spécifié et est prête pour les demandes des clients.

Voici quelques-unes des méthodes courantes de la classe ServerSocket -

Sr.No. Méthode et description
1

public int getLocalPort()

Renvoie le port sur lequel le socket serveur écoute. Cette méthode est utile si vous avez passé 0 comme numéro de port dans un constructeur et laissez le serveur trouver un port pour vous.

2

public Socket accept() throws IOException

Attend un client entrant. Cette méthode se bloque jusqu'à ce qu'un client se connecte au serveur sur le port spécifié ou que le socket expire, en supposant que la valeur du délai d'attente a été définie à l'aide de la méthode setSoTimeout (). Sinon, cette méthode se bloque indéfiniment.

3

public void setSoTimeout(int timeout)

Définit la valeur du délai d'attente pour la durée pendant laquelle le socket serveur attend un client pendant l'acceptation ().

4

public void bind(SocketAddress host, int backlog)

Lie le socket au serveur et au port spécifiés dans l'objet SocketAddress. Utilisez cette méthode si vous avez instancié le ServerSocket à l'aide du constructeur sans argument.

Lorsque le ServerSocket appelle accept (), la méthode ne retourne pas jusqu'à ce qu'un client se connecte. Une fois qu'un client se connecte, le ServerSocket crée un nouveau Socket sur un port non spécifié et renvoie une référence à ce nouveau Socket. Une connexion TCP existe maintenant entre le client et le serveur et la communication peut commencer.

Méthodes de classe de socket

le java.net.Socketclass représente le socket que le client et le serveur utilisent pour communiquer entre eux. Le client obtient un objet Socket en instanciant un, tandis que le serveur obtient un objet Socket à partir de la valeur de retour de la méthode accept ().

La classe Socket a cinq constructeurs qu'un client utilise pour se connecter à un serveur -

Sr.No. Méthode et description
1

public Socket(String host, int port) throws UnknownHostException, IOException.

Cette méthode tente de se connecter au serveur spécifié sur le port spécifié. Si ce constructeur ne lève pas d'exception, la connexion est réussie et le client est connecté au serveur.

2

public Socket(InetAddress host, int port) throws IOException

Cette méthode est identique au constructeur précédent, sauf que l'hôte est désigné par un objet InetAddress.

3

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

Se connecte à l'hôte et au port spécifiés, créant un socket sur l'hôte local à l'adresse et au port spécifiés.

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

Cette méthode est identique au constructeur précédent, sauf que l'hôte est désigné par un objet InetAddress au lieu d'un String.

5

public Socket()

Crée un socket non connecté. Utilisez la méthode connect () pour connecter ce socket à un serveur.

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

Certaines méthodes intéressantes de la classe Socket sont répertoriées ici. Notez que le client et le serveur ont un objet Socket, donc ces méthodes peuvent être appelées à la fois par le client et le serveur.

Sr.No. Méthode et description
1

public void connect(SocketAddress host, int timeout) throws IOException

Cette méthode connecte le socket à l'hôte spécifié. Cette méthode est nécessaire uniquement lorsque vous instanciez le Socket à l'aide du constructeur sans argument.

2

public InetAddress getInetAddress()

Cette méthode renvoie l'adresse de l'autre ordinateur auquel ce socket est connecté.

3

public int getPort()

Renvoie le port auquel le socket est lié sur la machine distante.

4

public int getLocalPort()

Renvoie le port auquel le socket est lié sur la machine locale.

5

public SocketAddress getRemoteSocketAddress()

Renvoie l'adresse du socket distant.

6

public InputStream getInputStream() throws IOException

Renvoie le flux d'entrée de la socket. Le flux d'entrée est connecté au flux de sortie de la prise distante.

sept

public OutputStream getOutputStream() throws IOException

Renvoie le flux de sortie de la socket. Le flux de sortie est connecté au flux d'entrée de la prise distante.

8

public void close() throws IOException

Ferme le socket, ce qui empêche cet objet Socket de se reconnecter à un serveur.

Méthodes de classe InetAddress

Cette classe représente une adresse IP (Internet Protocol). Voici les méthodes utiles dont vous auriez besoin lors de la programmation de socket -

Sr.No. Méthode et description
1

static InetAddress getByAddress(byte[] addr)

Renvoie un objet InetAddress en fonction de l'adresse IP brute.

2

static InetAddress getByAddress(String host, byte[] addr)

Crée un InetAddress basé sur le nom d'hôte et l'adresse IP fournis.

3

static InetAddress getByName(String host)

Détermine l'adresse IP d'un hôte, en fonction du nom de l'hôte.

4

String getHostAddress()

Renvoie la chaîne d'adresse IP dans une présentation textuelle.

5

String getHostName()

Obtient le nom d'hôte de cette adresse IP.

6

static InetAddress InetAddress getLocalHost()

Renvoie l'hôte local.

sept

String toString()

Convertit cette adresse IP en chaîne.

Exemple de client de socket

Le GreetingClient suivant est un programme client qui se connecte à un serveur à l'aide d'un socket et envoie un message d'accueil, puis attend une réponse.

Exemple

// File Name 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("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Exemple de serveur de socket

Le programme GreetingServer suivant est un exemple d'application serveur qui utilise la classe Socket pour écouter les clients sur un numéro de port spécifié par un argument de ligne de commande -

Exemple

// File Name 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("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + 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.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Compilez le client et le serveur puis démarrez le serveur comme suit -

$ java GreetingServer 6066
Waiting for client on port 6066...

Vérifiez le programme client comme suit -

Production

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!