Vous êtes ici :
Accueil Cours Programmations La Programmation Orientée Objet en Java Java et la programmation réseau (Socket Programming)

La Programmation Orientée Objet en Java : Java et la programmation réseau (Socket Programming)

Le terme programmation réseau se réfère à des programmes qui s'exécutent sur plusieurs appareils (ordinateurs), dans lesquels les périphériques sont tous connectés l'un à l'autre à l'aide d'un réseau.

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

Le paquetage java.net fournit un support pour les deux protocoles réseau communs:

  • TCP: TCP signifie Transmission Control Protocol (Protocole de contrôle de transmission), 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 de transmettre des paquets de données entre les applications.

Cette partie donne une bonne compréhension sur les deux sujets suivants:

  • Programmation Socket : c'est le concept le plus utilisé en réseau et il a été expliqué avec beaucoup de détails.
  • Traitement d'URL : cela serait couvert séparément.

Programmation Socket 

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

Lorsque la connexion est établie, le serveur crée un objet socket à la fin de la communication. Le client et le serveur peuvent maintenant communiquer en écrivant et en lisant depuis le socket.

La classe java.net.Socket représente un 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 crée une instance d’un objet ServerSocket, en indiquant la communication du numéro de port sur laquelle se produira.
  • Le serveur invoque la méthode accept( ) de la classe ServerSocket. Cette méthode attend jusqu'à ce qu'un client se connecte au serveur sur le port donné.
  • Une fois que le serveur est en attente, un client instancie un objet Socket, en précisant le nom du serveur et le numéro de port auquel vous vous connectez.
  • 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, le client a maintenant un objet Socket capable de communiquer avec le serveur.
  • Du côté du serveur, la méthode accept( ) renvoie une référence à une nouvelle socket sur le serveur qui est connecté au socket du client.

Une fois les connexions établies, la communication peut se produire en utilisant des flux d'E/S. Chaque socket possède un OutputStream et un InputStream. Le OutputStream du client est connecté au InputStream du serveur et le InputStream du client est connecté au OutputStream du serveur.

TCP est un protocole de communication twoway, de sorte que les données peuvent être envoyées à travers les deux flux en même temps. Il existe des classes utiles fournissant un ensemble complet de méthodes pour implémenter des sockets.

Méthodes de classe ServerSocket

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

La classe ServerSocket comporte quatre constructeurs:

SN

Méthodes avec description

1

public ServerSocket(int port) throws IOException

Essayer de créer une socket de serveur liée 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
Semblable au constructeur précédent, le paramètre de délai d'attente 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 vous souhaitez lier. InetAddress est utilisé pour les serveurs qui peuvent avoir plusieurs adresses IP, ce qui permet au serveur de préciser quelles sont ses adresses IP pour accepter les demandes des clients

4

public ServerSocket() throws IOException
Crée un socket serveur non lié. Lorsque vous utilisez ce constructeur, utilisez la méthode bind() lorsque vous êtes prêt à lier le socket du serveur

Si le constructeur de ServerSocket ne lance pas d'exception, cela signifie que votre application a été 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 :

SN

Méthodes avec description

1

public int getLocalPort()
Renvoie le port sur lequel le socket du serveur est en train d'écouter. Cette méthode est utile si vous avez passé 0 en tant que 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 bloque jusqu'à ce qu'un client se connecte au serveur sur le port spécifié ou que le socket dépasse, en supposant que la valeur de temporisation a été définie à l'aide de la méthode setSoTimeout (). Sinon, cette méthode bloque indéfiniment

3

public void setSoTimeout(int timeout)
Définit la valeur de temporisation pour la durée pendant laquelle le socket du serveur attend un client pendant accept().

4

public void bind(SocketAddress host, int backlog)
Lié la socket au serveur et au port spécifiés dans l'objet SocketAddress . Utilisez cette méthode si vous avez instancié le serveur en utilisant le constructeur sans argument.

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

Méthodes de classe  Socket

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

La classe Socket comporte cinq constructeurs qu'un client utilise pour se connecter à un serveur:

SN

Méthodes avec 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 lance pas une 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é, en 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'une chaîne

5

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

Lorsque le constructeur Socket retourne, il ne crée pas simplement d'instanciation d'un objet Socket mais tente de se connecter au serveur et au port spécifiés.

Certaines méthodes d'intérêt dans la classe Socket sont listées ici. Notez que le client et le serveur ont un objet Socket, de sorte que ces méthodes peuvent être invoquées par le client et le serveur.

SN

Méthodes avec description

1

public void connect(SocketAddress host, int timeout) throws IOException
Cette méthode relie le socket à l'hôte spécifié. Cette méthode n'est nécessaire que lorsque vous avez instancié l’objet Socket en utilisant le constructeur sans argument.

2

public InetAddress getInetAddress()
Cette méthode renvoie l'adresse de l'autre ordinateur auquel cette socket est connectée.

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 du socket. Le flux d'entrée est connecté au flux de sortie du socket distant.

7

public OutputStream getOutputStream() throws IOException
Renvoie le flux de sortie du socket. Le flux de sortie est connecté au flux d'entrée du socket distant

8

public void close() throws IOException
Ferme le socket, ce qui rend cet objet Socket plus capable de se connecter à nouveau sur n'importe quel serveur

Méthodes de classe InetAddress

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

SN

Méthodes avec description

1

static InetAddress getByAddress(byte[] addr)
Renvoie un objet InetAddress étant donné l'adresse IP brute.

2

static InetAddress getByAddress(String host, byte[] addr)
Créez une InetAddress en fonction du nom d'hôte fourni et de l'adresse IP.

3

static InetAddress getByName(String host)
Détermine l'adresse IP d'un hôte, compte tenu du nom de l'hôte.

4

String getHostAddress() 
Renvoie la chaîne d'adresse IP dans la présentation textuelle.

5

String getHostName()
Obtient le nom d'hôte de cette adresse IP.

6

static InetAddress getLocalHost()
Renvoie l'hôte local.

7

String toString()
Convertit cette adresse IP en chaine de caractère

Exemple d’un client socket

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

//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 d’un serveur socket

Le programme GreetingServer suivant est un exemple d'une 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:

//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();
      }
   }
}

 Compile le client et le serveur, puis lancez le serveur comme suit:

java GreetingServer 6066

Waiting for client on port 6066...

 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!




Vous êtes ici :
Accueil Cours Programmations La Programmation Orientée Objet en Java Java et la programmation réseau (Socket Programming)