Médiaforma

Java – Sockets TCP/IP

Print Friendly

Le protocole TCP (Transmission Control Protocol) permet de gérer des données en provenance/à destination de la couche IP (Internet Protocol). Sur un même ordinateur, plusieurs applications peuvent utiliser simultanément le protocole TCP. Pour que l’ordinateur puisse distinguer chaque application, on utilise des ports de communication. Un port est ainsi affecté à chaque application et TCP sait à qui sont destinés/de qui sont issus les paquets qu’il manipule.

Un ordinateur peut gérer jusqu’à 65536 ports :

  • Les ports 0 à 1023 sont réservés aux processus système. N’utilisez pas ces ports dans vos applications en TCP/IP.
  • Les ports 1024 à 49151 sont des ports « enregistrés ». Consultez la page http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Registered_ports pour savoir quels sont les ports qui pourraient être utilisés et choisissez un port libre pour communiquer dans vos applications en TCP/IP.
  • Les ports 49152 à 65535 sont des ports « dynamiques » et/ou « privés ». N’utilisez pas ces ports dans vos applications en TCP/IP.

 

Pour créer une communication en TCP/IP, vous allez devoir écrire deux programmes : un serveur et un client.

Le serveur sera à l’écoute des demandes du client et les traitera. Le client enverra des demandes au serveur et recevra une réponse en retour.

Voici les actions à effectuer côté serveur :

  1. Vous définirez un objet de classe ServerSocket, en précisant le port à utiliser. Cet objet attendra les requêtes des clients et leur répondra en retour.
  2. Vous définirez une boucle sans fin qui attendra et traitera les requêtes des clients.
  3. Dans cette boucle, vous appellerez la méthode ServerSocket.accept() pour obtenir un objet Socket lors de chaque connexion du client.
  4. Vous définirez un objet BufferedReader pour lire les données envoyées par le client (InputStreamReader(socketClient.getInputStream()).
  5. Vous définirez également un objet PrintStream pour écrire du texte sur le client (socketClient.getOutputStream()).
  6. Une fois tous ces objets mis en place, vous pourrez (par exemple) retourner au client le texte qu’il a envoyé au serveur.
  7. Avant de terminer la boucle sans fin, pensez à fermer le socket client qui avait été obtenu avec la méthode ServerSocket.accept().

Voici le code utilisé :

import java.net.*;
import java.io.*;
public class serveur {
  final static int port = 1030;
  public static void main(String[] args) {
    try {
      ServerSocket socketServeur = new ServerSocket(port);
      System.out.println("Le serveur est à l'écoute...");
      while (true) {
        Socket socketClient = socketServeur.accept();
        String message = "";
        BufferedReader in = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));
        PrintStream out = new PrintStream(socketClient.getOutputStream());
        message = in.readLine();
        System.out.println("Connexion établie avec " + socketClient.getInetAddress());
        System.out.println("Chaîne reçue : " + message + "\n");
        out.println(message);
        socketClient.close();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Passons au client.

Pour communiquer avec le serveur, vous définirez :

  1. Un objet de classe Socket, en lui communiquant l’adresse IP et le port du serveur.
  2. Un objet BufferedReader pour lire les données envoyées par le serveur.
  3. Un objet PrintStream pour envoyer au serveur le texte entré par le client.

Il vous suffira alors d’envoyer le texte au serveur avec la méthode println() appliquée à l’objet PrintStream, d’obtenir sa réponse avec la méthode readLine() appliquée à l’objet BufferedReader et de l’afficher avec un System.out.println().

Voici le code utilisé :

import java.net.*;
import java.io.*;
public class client {
  final static int port = 1030;
  public static void main(String[] args) {
    Socket;
    DataInputStream userInput;
    PrintStream theOutputStream;
    try {
      InetAddress serveur = InetAddress.getByName("localhost");
      socket = new Socket(serveur, port);
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      PrintStream out = new PrintStream(socket.getOutputStream());
      out.println(args[0]);
      System.out.println(in.readLine());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Pour que ce code fonctionne, pensez à lancer l’application Monitor Tomcat, puis à démarrer les services en cliquant du bouton droit sur l’icône Monitor Tomcat dans la Zone de notification et en choisissant Start Service dans le menu :

 

 

Compilez le serveur avec la commande suivante :

javac serveur.java

Lancez le serveur avec la commande :

javac serveur

Compilez le client avec la commande suivante :

javac client.java

Lancez le client avec la commande :

javac client uneChaine

uneChaine est la chaîne de caractères à envoyer au serveur.

 

Voici le résultat :

 

 

Vous avez aimé cet article ? Partagez-le avec vos réseaux...
 
Comments

No comments yet.

Leave a Reply