les sockets et java cours réseaux essi2 anne-marie déry
TRANSCRIPT
![Page 1: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/1.jpg)
Les Sockets et Java
Cours réseaux Essi2
Anne-Marie Déry
![Page 2: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/2.jpg)
Sockets ?
Outil de communication pour échanger des données entre un client et un serveur
Canaux de communication (descripteur d’entrée sortie dans lesquels on écrit et sur lesquels on lit)
![Page 3: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/3.jpg)
Architecture client serveur
Mode de communication qu’un hôte établit avec un autre hôtequi fournit un service quelconque
applicationopération
Client
Serveur
Send request
Send reply
« protocole d’application »
![Page 4: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/4.jpg)
Exemples d ’applications
ClassiquesServeur de MessagesServeur de news SocketsServeur de fichiers
Applications distribuées RMIRéservation de voyagesServeurs de vente
Composants distribués…. EJBs
![Page 5: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/5.jpg)
Besoins d’une application Client-Serveur
Similitudes avec un appel téléphonique via un standard
1. Trouver l’adresse du serveur : trouver le no de téléphone de l’entreprise2. Demander un service spécifique : s’adresser à un service ou une personne précise de l’entreprise (no de poste)3. Faire la requête 4. Obtenir une réponse
Adresse d’un serveur ?Identification d’un service ?
![Page 6: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/6.jpg)
Un peu de vocabulaire
Client : entité qui fait l ’appelSockets : moyen de communication entre ordinateursAdresses IP : adresse d’un ordinateurServeur : entité qui prend en charge la requêteServeur de noms (DNS) : correspondances entre noms logiques et adresses IP (Annuaire)Port : canal dédié à un serviceProtocole :langage utilisé par 2 ordinateurs pour communiquer entre eux
![Page 7: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/7.jpg)
Adresse Internet et Port
Adresse internet attribuée à chaque nœud du réseausérie d ’octets dont la valeur dépend du type de réseauassociée à un nom logique (Domain Name Server)
Chaque hôte possède environ 65535 ports
Port canal dédié à un service spécifique80 pour le service http25 pour le service SMTPTCP implique une file d’attente par connexionUDP implique une file d’attente unique pour le port
![Page 8: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/8.jpg)
Exemples d ’adresses Internetypcat hosts sur SUN
157.169.9.15 oscar.essi.fr oscar157.169.20.5 accueil.essi.fr accueil157.169.20.4 compta.essi.fr compta157.169.25.201 www-local.essi.fr www-local157.169.10.222 pcprofs.essi.fr pcprofs157.169.4.50 ada.essi.fr ada157.169.10.120 macserver.essi.fr macserver157.169.10.240 demo.essi.fr demo157.169.1.20 bibli.essi.fr bibli157.169.25.110 sfe-srv.essi.fr sfe-srv sfe157.169.1.153 bde.essi.fr bde157.169.3.204 niv1a.essi.fr niv1a157.169.1.155 dessi.essi.fr dessi157.169.10.2 jessica.essi.fr jessica print2
![Page 9: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/9.jpg)
Exemples d ’adresses
157.169.25.200 news-srv.essi.fr news-srv www.essi.fr www-srv.essi.fr news134.59.132.21 dolphin.unice.fr157.169.10.1 essi2.essi.fr loghost essi2
Essi : 157.169I3S: 134.59serveurs : 25Administration : 1…….
![Page 10: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/10.jpg)
Ports réservés
TCPServeur FTP : 21Serveur Telnet : 23Serveur SMTP : 25
UDPAgent SNMP : 161Logger SNMP : 162Serveur rwhod : 513
Serveur multi processus Applications transactionnelles
1 à 1024 services fondamentaux (administrateurs)(sous unix cf. le fichier /etc/services)1025 à 5000 disponibles pour les utilisateurs
![Page 11: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/11.jpg)
Plus précisément un socket
Plusieurs types de sockets :pour la communication inter processus classiquepour communication réseau en mode datagrammepour communication réseau en mode connecté
une machine joue le rôle du serveur et une autre(ou plusieurs) pour le client
![Page 12: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/12.jpg)
Scénario d’un serveur
Création d ’un paquet d ’entréeAttente de données en entréeRéception des données en entrée et calculCréation d’un paquet de sortieEnvoi de la réponse
Fermer le socket d ’entrée
Créer le socket d ’entrée
![Page 13: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/13.jpg)
Scénario d’un client
Créer un paquet de sortieEnvoyer une requête Créer un paquet d ’entréeAttendre des données en entrée Recevoir les données et les traiter
Fermer le socket d ’entrée
Créer le socket d ’entrée
![Page 14: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/14.jpg)
Sockets (Communication Client serveur)
Serveur connecte le client sur un nouveau no de portet reste en attente sur le port original
Client et serveur communiquent en écrivant et lisant sur un socket
Serveur est à l’écoute des requêtes sur un port particulierUn client doit connaître l’hôte et le port sur lequel le serveur écoute. Le client peut tenter une connexion au serveur
![Page 15: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/15.jpg)
Serveurs actifs
Activation manuelle peu recommandéeUtilisation de Inetd sous UNIX
Serveur particulier (démon) attend pour les autresserveurs
fichier de configuration : /etc/inetd.conffichier /etc/services
![Page 16: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/16.jpg)
Contexte : modèle OSI
Couches Transports : Transmission Control ProtocolUser Datagram Protocol
Couche communication : Internet Protocol
Mode connecté vs mode non connecté
rester en ligne pour demander plusieurs services ou rappeler l’entreprise pour chaque nouvelle requête
![Page 17: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/17.jpg)
Sockets en Java ?
BSD sockets UNIXau dessus de TCP ou UDP
En Java toutes les classes relatives aux socketssont dans le package java.net
Une infrastructure puissante etflexible pour la programmation réseau
![Page 18: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/18.jpg)
Le Package net
Des Exceptions Des entrées Sorties Des Sockets …...
Plusieurs hiérarchies de classes
![Page 19: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/19.jpg)
Des types de Sockets
ServerSocket
HttpAwareServerSocket
DatagramSocket
MulticastSocket
Socket
HttpSendSocket WrappedSocket
Object
![Page 20: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/20.jpg)
Des exceptions
Exception
IOException
SocketException ProtocolException UnknownHostException UnknownServiceException
BindException ConnectException
![Page 21: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/21.jpg)
Des Entrées Sorties
Object
InputStream
FileInputStream
SocketInputStream
OutputStream
FileOutputStream
SocketOutputStream
![Page 22: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/22.jpg)
Autres Classes
Object
InetAdress DatagramPacket SocketImpl
PlainSocketImpl
![Page 23: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/23.jpg)
Programmation en Java
Les opérations de base Un exemple : le service SMTP Un serveur d’Echo Aperçus des autres types de communication
– Plusieurs Clients gérés simultanément ( ligne non occupée)
– Client Serveur dataGram
– Communication Broadcast (réunion téléphonique)
![Page 24: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/24.jpg)
Java.net.InetAddress : nommage
La classe InetAddress
2 constructeurs : un par défaut qui crée une adresse vide (cf la méthode accept sur Socket)
un qui prend le nom de la machine hôte et l’adresse IP de la machine.Des accesseurs en lecture : pour récupérer l’adresse IP d’une machine (getByName, getAllByName), des informations sur lamachine hôte (getLocalHost, getLocalAddress, getLocaName)Des comparateurs : égalité (equals) et type d’adresse (isMulticastAddress)…..
![Page 25: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/25.jpg)
TCP et Sockets
2 classes : Socket et ServerSocket (java.net package)
![Page 26: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/26.jpg)
Flot de requêtes du client vers le serveur
applicationopération
Client
Serveur
Ouvrir connexionreq1req2req3
reqn
Fermer la connexion
![Page 27: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/27.jpg)
TCP et SocketsLa classe Socket :
une batterie de constructeurs : par défaut,no de port + adresse / nom de machine et service distante,+ no de port + adresse locale,créent un socket en mode Stream ou DataGramme
des accesseurs en lecture : no de port et adresse à laquelle il est connecté, no de port et adresse à laquelle il est lié, input et output Stream associés (getPort, getInetAddress, getLocalPort, getLocalAddress, getInputStream, getOutputStream…)
des méthodes : close...
![Page 28: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/28.jpg)
TCP et SocketsLa classe ServerSocket
des constructeurs : par défaut,no de port associé, + taille de la liste de clients en attente +adresse...
des accesseurs en lecture : no de port sur lequelle socket écoute, adresse à laquelle il est connecté (getPort, getInetAddress, …)
des méthodes : accept pour accepter une communication avec un client, close...
![Page 29: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/29.jpg)
Un socket : une entrée sortie dédiée au réseau
Gestion similaire des entrées sorties standard (écran, clavier) etdes fichiers
En sortie (ex. System.out) : java.io.PrintStream (ou PrintWriter)utilise un flot dirigé vers une sortie java.io.OutputStream
En entrée (ex. System.in) : java.io.InputStream
![Page 30: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/30.jpg)
Comment ouvrir un socket ?
Dans un client Socket MyClient; try { MyClient = new Socket("Machine name", PortNumber); } catch (IOException e) { System.out.println(e); }
Machine name : machine à laquelle on veut se connecter PortNumber port sur lequel tourne le serveur (> 1023)
![Page 31: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/31.jpg)
Dans un serveur ?
ServerSocket MyService; try { MyServerice = new ServerSocket(PortNumber); } catch (IOException e) {System.out.println(e);}
Création d’un objet socket pour écouter et accepter les connexions des clients
Socket clientSocket = null; try { ServiceSocket = MyService.accept();} catch (IOException e) {System.out.println(e); }
![Page 32: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/32.jpg)
Comment créer un Input Stream ?
Côté client : pour recevoir une réponse du serveur
try {input = new DataInputStream(MyClient.getInputStream());}catch (IOException e) {System.out.println(e);}
DataInputStream : lire des lignes de texte, des entiers, desdoubles,des caractères... ( read, readChar, readInt, readDouble, and readLine,. )
![Page 33: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/33.jpg)
Côté Serveur
pour recevoir les données d’un client
DataInputStream input;:try { input = new DataInputStream(serviceSocket.getInputStream()); }catch (IOException e) {System.out.println(e);}
![Page 34: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/34.jpg)
Comment créer un Output Stream?
Côté client : pour envoyer une information au serveur (PrintStream ou DataOutputStream)
PrintStream output;try {output = new PrintStream(MyClient.getOutputStream;}catch (IOException e) {System.out.println(e);}
PrintStream pour afficher des valeurs des types de base(write et println)
…..
![Page 35: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/35.jpg)
Côté Serveur
Pour envoyer des informations au clientPrintStream output; try {output = new PrintStream(serviceSocket.getOutputStream()); } catch (IOException e) {System.out.println(e);}
DataOutputStream : écrire des types de données primitifs; (writeBytes…)output=new DataOutputStream(serviceSocket.getOutputStream());
![Page 36: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/36.jpg)
Autres entrées sorties
echoSocket = new Socket( "jessica", 7); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream()));
![Page 37: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/37.jpg)
Comment fermer un socket ?
Fermer les output et input stream avant le socket. Côté client
output.close(); input.close(); MyClient.close();Côté serveur output.close(); input.close(); serviceSocket.close(); MyService.close();
![Page 38: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/38.jpg)
Comment écrire un client ?
Toujours 4 étapesOuvrir un socket.
Ouvrir un input et un output stream sur le socket. Lire et écrire sur le socket en fonction du protocole du serveur. Effacer Fermer
Seule l’étape 3 change selon le serveur visé
![Page 39: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/39.jpg)
Client SMTP (Simple Mail Transfer Protocol),
import java.io.*; import java.net.*; public class smtpClient { public static void main(String[] args) { Socket smtpSocket = null; // le socket client DataOutputStream os = null; // output stream DataInputStream is = null; // input stream try { smtpSocket = new Socket("hostname", 25); os = new DataOutputStream(smtpSocket.getOutputStream()); is = new DataInputStream(smtpSocket.getInputStream()); } catch (UnknownHostException e) { System.err.println("Don't know about host: hostname"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: hostname"); }
![Page 40: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/40.jpg)
Le protocole SMTP, RFC1822/3
if (smtpSocket != null && os != null && is != null) { try{os.writeBytes("HELO\n"); os.writeBytes("MAIL From: [email protected]\n"); os.writeBytes("RCPT To: [email protected]\n"); os.writeBytes("DATA\n"); os.writeBytes("From: [email protected]\n"); os.writeBytes("Subject: Qui est là ?\n"); os.writeBytes("Vous suivez toujours ?\n"); // message os.writeBytes("\n.\n"); os.writeBytes("QUIT");
![Page 41: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/41.jpg)
SMTP
// attente de "Ok" du serveur SMTP, String responseLine; while ((responseLine = is.readLine()) != null) { System.out.println("Server: " + responseLine); if (responseLine.indexOf("Ok") != -1) {break;}} os.close(); is.close(); smtpSocket.close(); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException){ System.err.println("IOException: " + e);} } } }
.
![Page 42: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/42.jpg)
Serveur Echo
Un serveur similaire à echo ( port 7). Reçoit un texte du client et le renvoie identiqueLe serveur gère un seul client.
![Page 43: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/43.jpg)
Déclarations
import java.io.*; import java.net.*;public class echo3 { public static void main(String args[]) { ServerSocket echoServer = null; String line; DataInputStream is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999);} catch (IOException e) {System.out.println(e); }
![Page 44: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/44.jpg)
try { clientSocket = echoServer.accept(); is = new DataInputStream(clientSocket.getInputStream()); os = new PrintStream(clientSocket.getOutputStream()); while (true) { line = is.readLine(); os.println(line); } } catch (IOException e) { System.out.println(e);} } }
![Page 45: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/45.jpg)
Plusieurs clients
application
Clientn
ServeurOuvrir connexion
application
Client1
application
Client2 S1
S2
Sn
![Page 46: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/46.jpg)
Plusieurs Clients
Utiliser des threads pour accepter plusieurs clients simultanément.
Le serveur gère un thread par client
Thread constructeurstart
run
![Page 47: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/47.jpg)
Quelques mots sur les Threads
Un thread permet l’exécution d’un programme. Une application peut avoir de multiples threads qui s ’exécutentconcurremment (Chaque thread a une priorité). Chaque thread a un nom. Plusieurs threads peuvent avoir lemême. Le nom est généré si non spécifié. Il y a 2 façons de créer un nouveau thread d’exécution.
déclarer une sous classe de Thread et surchargerla méthode run. Une instance de la sous classe peut alorsêtre allouée et démarrer.
déclarer une classe qui implémente Runnable et doncla méthode run. Une instance de la classe peut être allouée, passée comme argument à la création d’un threadet démarrée.
![Page 48: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/48.jpg)
Un thread qui calcule des primes
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
PrimeThread p = new PrimeThread(143); p.start();
![Page 49: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/49.jpg)
Version2
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
PrimeRun p = new PrimeRun(143); new Thread(p).start();
![Page 50: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/50.jpg)
Datagrammes UDP et Sockets
2 classes : DatagramPacket et DatagramSocket
Datagramme = un message indépendant envoyé sur le réseau arrivée, temps d’arrivée et contenu non garantis
packages d’implémentation de communication via UDP de datagrammes
![Page 51: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/51.jpg)
Exemple
Un serveur de citation qui écoute un socket type datagram et envoie une citation si le client le demandeUn client qui fait simplement des requêtes au serveur
ATTENTION Plusieurs firewalls et routeurs sont configurés pour interdire le passage de paquets UDP
![Page 52: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/52.jpg)
Envoi de datagrammes
applicationopération
Client
Serveur
req1rep1
reqnrepn
![Page 53: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/53.jpg)
Classe DatagramSocket
Des constructeurs : par défaut, + no port + Adresse Inet
Des accesseurs en lecture : adresse à laquelle le socket est lié, est connecté, le no port auquel il est lié, connecté, taille du buffer reçu ou envoyé (getInetAddress, getLocalAddress, getPort, getLocalPort, getReceivedBufferSize, getSendBufferSize…)
Des méthodes : pour se connecter à une adresse, pour sedéconnecter, pour envoyer un paquet datagramme, pour un recevoir un paquet datagramme (connect, disconnect, send, receive)
![Page 54: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/54.jpg)
Classe DatagramPacket
Des constructeurs : buffer + longueur de buffer + adresse destination + port…
Des accesseurs en lecture : adresse à laquelle le paquet est envoyé, le no port à laquelle le paquet est envoyé, la donnée transmise (getAddress, getPort, getData, getLength…)
![Page 55: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/55.jpg)
Une Application Client Serveur
Le serveur reçoit en continu des paquets mode datagramme sur un socketun paquet reçu = une demande de citation d’un client le serveur envoie en réponse un paquet qui contient
une ligne "quote of the moment"
L’application cliente envoie simplement un paquetdatagramme au serveur indiquant qu’il souhaiterecevoir une citation et attend en réponse un paquetdu serveur.
![Page 56: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/56.jpg)
La classe QuoteServer
import java.io.*;public class QuoteServer { public static void main(String[] args) throws IOException { new QuoteServerThread().start(); } }
la classe QuoteServerThread implémente toute la logique du serveur.
![Page 57: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/57.jpg)
La classe QuoteServerThread
public QuoteServerThread() throws IOException { this("QuoteServer"); }public QuoteServerThread(String name) throws IOException { super(name); socket = new DatagramSocket(4445);Création d’un DatagramSocket sur le port 4445 qui permet au serveurde communiquer avec tous ces clients
try { in = new BufferedReader(new FileReader("one-liners.txt")); } catch (FileNotFoundException e) System.err.println("Couldn't open quote file. " + "Serving time instead."); } } Le constructeur ouvre aussi un BufferedReader sur un fichier qui contientune liste de citations ( une citation par ligne)
![Page 58: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/58.jpg)
La méthode RUNimplémentation du threadcontient une boucle qui tant qu’il y a des citations dans le fichierattend l’arrivée d ’un DatagramPacket correspondant à une requête client sur un DatagramSocket.
Byte[] buf = new byte[256];DatagramPacket packet = new DatagramPacket(buf, buf.length);socket.receive(packet);
En réponse une citation est mise dans un DatagramPacket et envoyée sur leDatagramSocket au client demandeur.
String dString = null;if (in == null) dString = new Date().toString();else dString = getNextQuote();buf = dString.getBytes();InetAddress address = packet.getAddress();
int port = packet.getPort(); packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet);
![Page 59: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/59.jpg)
Suite
Adresse Internet + numéro de port (issus du DatagramPacket )= identification du client pour que le serveur puisse lui répondre
L’arrivée du DatagramPacket implique une requête ->contenu du buffer inutile
Le constructeur utilisé pour le DatagramPacket : un tableau d’octets contenant le message et la taille du tableau
+ L’adresse Internet et un no de port.
Lorsque le serveur a lu toutes les citationson ferme le socket de communication. socket.close();
![Page 60: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/60.jpg)
La classe QuoteClient
envoie une requête au QuoteServer, attend la réponse et affiche la réponse à l’écran.
Variables utilisées : int port; InetAddress address; DatagramSocket socket = null; DatagramPacket packet; byte[] sendBuf = new byte[256];Le client a besoin pour s ’exécuter du nom de la machine sur laquelle tourne le serveurif (args.length != 1) { System.out.println("Usage: java QuoteClient <hostname>"); return; }
![Page 61: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/61.jpg)
La partie principale du main
Création d ’un DatagramSocketDatagramSocket socket = new DatagramSocket();
Le constructeur lie le Socket à un port local libre Le programme envoie une requête au serveur
byte[] buf = new byte[256];InetAddress address = InetAddress.getByName(args[0]);DatagramPacket packet = new DatagramPacket(buf, buf.length,
address, 4445); socket.send(packet);
Ensuite le client récupère une réponse et l’affiche
![Page 62: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/62.jpg)
Multicasr
application
Clientn
Serveur
application
Client1
application
Client2
Gr
![Page 63: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/63.jpg)
Exemple de multicast
Un serveur de citation qui envoie une citation toutes les minutes à tous les clients qui écoutent (multicast)
![Page 64: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/64.jpg)
Classe MulticastServer
Des constructeurs : par défaut, port à utiliser
Des accesseurs en lecture : adresse du groupe (getInterface…)
Des méthodes : pour envoyer un paquet datagramme, pour joindre ou quitter un groupe (send, joinGroup, leaveGroup)
![Page 65: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/65.jpg)
Broadcast: MulticastSocket
Type de socket utilisé côté client pour écouter des paquets quele serveur « broadcast » à plusieurs clients. .
Une extension du QuoteServer : broadcast à intervalle régulier à tous ses clients
Le serveur a un nouveau nom et crée un MulticastServerThreadqui contient le cœur du serveur.
import java.io.*; public class MulticastServer { public static void main(String[] args) throws IOException { new MulticastServerThread().start(); } }
![Page 66: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/66.jpg)
public class MulticastServerThread extends QuoteServerThread { ... }
utilisation du constructeur par héritage et héritage de variables et de la méthode getNextQuote
![Page 67: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/67.jpg)
Une nouvelle méthode RUNpublic void run() { while (moreQuotes) { try { byte[] buf new byte[256]; // don't wait for request...just send a quote
String dString = null; if (in == null) dString = new Date().toString(); else dString = getNextQuote(); buf = dString.getBytes(); InetAddress group = InetAddress.getByName("230.0.0.1"); DatagramPacket packet; packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet);
try {sleep((long)Math.random() * FIVE_SECONDS); } catch (InterruptedException e) { } } catch (IOException e) { e.printStackTrace(); moreQuotes = false;} } socket.close();}
![Page 68: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/68.jpg)
Différences principales
Le DatagramPacket est construit à partir de de « l’adresse de plusieurs clients »
L ’adresse et le no de port sont câblés
no de port 4446 (tout client doit avoir un MulticastSocket lié à ce no). L’adresse InetAddress "230.0.0.1" correspond à un identificateur de groupe et non à une adresse Internet de la machine d’un client
Le DatagramPacket est destiné à tous les clients qui écoutent le port 4446 et qui sont membres du groupe "230.0.0.1".
![Page 69: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/69.jpg)
Un nouveau Client
Pour écouter le port 4446, le programme du client doit créer son MulticastSocket avec ce no. Pour être membre du groupe "230.0.0.1" le client adresse la méthode joinGroup du MulticastSocket avec l’adresse d’identification du groupe.
Le serveur utilise un DatagramSocket pour faire du broadcast à partirde données du client sur un MulticastSocket. Il aurait pu utiliser aussiun MulticastSocket. Le socket utilisé par le serveur pour envoyer leDatagramPacket n’est pas important. Ce qui est important pour lebroadcast est d’adresser l’information contenue dans le DatagramPacket, et le socket utilisé par le client pour l’écouter.
![Page 70: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/70.jpg)
MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName("230.0.0.1"); socket.joinGroup(group);
DatagramPacket packet; for (int i = 0; i < 5; i++) { byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); socket.receive(packet);
String received = new String(packet.getData()); System.out.println("Quote of the Moment: " + received); } socket.leaveGroup(group);
socket.close();
![Page 71: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/71.jpg)
Synthèse
Client Serveur
TCP aSocket aServerSocketconnecté write read
read write
UDP aDatagramSocket aDatagramSocketnon connecté send receive
receive send
Broadcast aMulticastSocket aDatagramSocket/aMulticastSocket
receive send
I/O Stream I/O Stream
aDatagramPacket
![Page 72: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/72.jpg)
Définir un nouveau type de socketPourquoi ?
Préparer les données avant de les envoyerPréparer les données reçues
ExempleJava RMI Sockets spécialisées (marshalling et unmarshalling)
Images : Compression et Décompression
Comment ?En spécialisant les classes de base
![Page 73: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/73.jpg)
Comment Définir un nouveau type de Sockets
La classe CompressionSocket et ses classes relatives4 étapes
1. Etendre java.io.FilterOutputStream pour créer un output stream pour ce type de Socket. Surcharge de méthodes si nécessaire. 2. Etendre java.io.FilterInputStream 3. Etendre java.net.Socket . Implémenter les constructeurs appropriés et surchargergetInputStream, getOutputStream et close. 4. Etendre java.net.ServerSocket Implémenter le constructeur et surcharger acceptpour créer un socket du bon type.
![Page 74: Les Sockets et Java Cours réseaux Essi2 Anne-Marie Déry](https://reader035.vdocuments.net/reader035/viewer/2022062404/551d9d81497959293b8bb29f/html5/thumbnails/74.jpg)
Conclusion
Une large bibliothèque pour traiter les sockets et différents types de communication entre Clients et Serveurs dans Java
Une extension naturelle par abstraction à l’appel de méthodes à distance - Java RMI
et une normalisation Corba avec l’intégration d’un ORB
et maintenant les EJB : Entreprise Java Beanset JINI …..