Ce document intitulé "TP N°3 : La Communication par Sockets" est destiné aux étudiants de Master 1 du Département du IFA à la Faculté des nouvelles technologies de l'Université Constantine 2 –Abdelhamid Mehri. Il vise à comprendre le fonctionnement des Sockets en mode connecté (TCP) et l'utilisation des classes InetAddress, ServerSocket et Socket.
Il couvre les notions suivantes:
- Les bases de la communication entre humains et informatiques.
- Les couches du modèle OSI et du modèle TCP/IP.
- Les manipulations sur les adresses IP et les interfaces réseau en Java.
- Les types de Sockets et les protocoles de communication.
- Des exercices pratiques de client-serveur en Java.
Exercices TP Communication par Sockets -Développement d'applications réparties
Télécharger PDFUniversité Constantine 2 –Abdelhamid Mehri
Faculté des nouvelles technologies
Département du IFA / Master 1
TP N°3 : La Communication par Sockets
Objectif : L’objectif de ce troisième TP est de comprendre le fonctionnement global des Sockets en mode connecté (TCP) et d’appréhender l’utilisation des classes suivantes : InetAddress, ServerSocket et Socket.
M Lounes Bessalah
Matière D.A.R.E 2020-2021
La communication ?
Humains VS Informatiques
- Connaître le correspondant (Nom, status..).
- Avoir un Langage commun(fr,ar,en…).
- Avoir un sujet commun de conversation(travail,vie..).
- Être de près ou de loin au même endroit.
- Adresse (logique/physique).
- Protocoles de communications (language de com.).
- Port (services, programmes, applications….).
- Connecter a un réseau commun.
en Java?
Couche 1 (physique) :
du matériel de support de transmission (câbles etc.) ;
Couche 2 (liaison de données) :
de quoi connecter les machines entres elles (switch, carte réseau etc,) ;
Couche 3 (réseau) :
de quoi connecter les réseaux entre eux ;
Couche 4 (transport) :
de quoi définir les identifiant de ports et de protocole ;
Couche 5 (session) :
aucune importance, existence théorique ;
Couche 6 (présentation) :
aucune importance, existence théorique ;
Couche 7 (application) :
l'application initiatrice de la communication (navigateur, client mail etc,).
Couche 1 (hôte réseau) :
permet a un hôte d’envoyer des paquets IP sur le réseau.
Couche 2 (INTERNET) :
Son rôle est de permettre l’injection de paquets dans n’importe quel réseau et l’acheminement des ces paquets indépendamment les uns des autres jusqu’à destination.
Couche 3 (transport) :
le protocole TCP (Transmission Control Protocol) et le protocole UDP (User Datagram Protocol).
Couche 4 (Application) :
les protocoles de haut niveau;
Modèle OSI 7C Modèle TCP/IP
Manipulation sur java network
Manipulation sur les adresses IP: Class java.net.InetAddress
Liste de toutes les interfaces réseau : Class java.net.NetworkInterface;
Liste Ip adresses « Internet »:
URL java.net.URL: P.Com. Addresse Serveur. Arborescences
JAVA Sockets
lorsque vous recherchez une page web sur Internet, avant que celle-ci ne s'affiche, une multitude de paquets sont échangés, car les données sont divisées en plusieurs morceaux et réassemblés à l'arrivée pour être utilisées :
- Les sockets vous permettent de ne pas avoir à faire ce travail de découpage vous-mêmes,
- Elles vous permettent de traiter n'importe quelle communication réseau comme si vous lisiez ou écriviez dans un fichier. En fait, elles vous permettent de :
- Vous connecter à une machine distante ;
- Recevoir et envoyer des données ;
- Fermer une connexion établie ;
- Attendre une connexion de l'extérieur ;
- Écouter les communications entrantes ;
- Utiliser un port.
Types de Sockets |Protocoles
- Communication par TCP ->(protocoles TCP)
- Socket Stream->java.net.ServerSocket; et java.net.Socket;
Exercice N°1 :CLIENT SERVER.
Prérequis
Niveau 1
Coté client :
- Classes java : Client
- Methodes java : public static void main(String args[]) throws Exception{…}
- Variables utilisées java : new Socket(?,?); new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) new PrintWriter(??,true);
- String MessageClient = "je suis le client N° " + identifiantClient +" : Ma requete est : \nEND";
- writer.println(MessageClient);
- J’écoute en boucle + String line = reader.readLine(); si line ==fin ou vide je sort sinon je lis
Coté Serveur :
- Classes java : Serveur
- Methodes java : public static void main(String args[]) throws Exception{…}
- Variables utilisées java : new ServerSocket(?); Socket socket = serverSocket.accept();
- Buffer pour lecture à l'inverse du buffer du client (voir client side) Un autre Buffer pour ecriture car le client attend une reponse (voir client side)
- J’écoute en boucle + String line = reader.readLine(); si line ==fin ou vide je sort sinon je lis
- response = "Réponse du serveur\nEND";
- writer.println(response);
Coté Server et coté client
il faut toujours fermé les flux ,les sockets ,les connexions. reader.close(); writer.close(); socket.close();
Correction client
Niveau 1
Correction serveur
Niveau 1
Exercice N°2 :CLIENT SERVER.
Prérequis
Niveau 2
Coté client niveau 2 :
- Classes java : Client + constructeur
- Methodes java : public static void main(String args[]) throws Exception{ Client client = new Client();}
- Variables utilisées java : private String serverName = "localhost"; private int serverPort = 8081; private Socket socket = null; private DataOutputStream dos = null; Scanner scan=new Scanner(System.in);
- while (true) { try { System.out.print("Message to server : "); String messageToServer = scan.nextLine(); if(messageToServer.equals("exit")){ break; } dos.writeUTF(messageToServer); dos.flush(); } catch (IOException e) { break; } }
Coté Serveur niveau 2 :
- Classes java : Serveur + constructeur
- Methodes java : public static void main(String args[]) throws Exception{ Server server = new Server();}
- Variables utilisées java : private int port = 8081; private Socket socket = null; private ServerSocket serverSocket = null; private BufferedInputStream bis = null; private DataInputStream dis = null; bis = new BufferedInputStream(socket.getInputStream()); dis = new DataInputStream(bis);
- while (true) { try { String messageFromClient = dis.readUTF(); if (messageFromClient.equals("exit")) { break; } System.out.println("Client [" + socket.getRemoteSocketAddress() + "] : " + messageFromClient); } catch (IOException e) { break; } }
Résultats
- Console serveur (en premier),
- Console Client ou clients :
Exercice N°3 :CLIENT SERVER Salon de chat entre clients.
Niveau 3
Cotés serveur
- socket = serverSocket.accept(); en boucle pour N client
- Liste de sockets .
- Reçois et retransmet
Exercice N°4 :CLIENT SERVER Salon de chat entre clients+ interface graphique
Niveau 4
Fin du troisième TP
FAQ
Qu'est-ce qu'un socket en Java?
Un socket en Java est une abstraction qui permet de communiquer avec d'autres machines sur un réseau. Il permet de recevoir et d'envoyer des données, de se connecter à une machine distante, et de gérer les connexions réseau.
Quelle est la différence entre TCP et UDP?
TCP (Transmission Control Protocol) est un protocole orienté connexion qui garantit la livraison des données dans l'ordre et sans erreur. UDP (User Datagram Protocol) est un protocole sans connexion qui ne garantit pas la livraison des données mais est plus rapide.
Comment fermer correctement une connexion socket en Java?
Pour fermer correctement une connexion socket en Java, il est important de fermer les flux de lecture et d'écriture, puis de fermer le socket lui-même. Cela se fait généralement en appelant les méthodes close() sur les objets de flux et de socket.