La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Programmation Réseaux Illustration : Les Sockets en Java

Copies: 1
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.

Présentations similaires


Présentation au sujet: "Programmation Réseaux Illustration : Les Sockets en Java"— Transcription de la présentation:

1 Programmation Réseaux Illustration : Les Sockets en Java
Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java

2 Exemples d ’applications
Classiques Serveur de Messages Serveur de news Sockets Serveur de fichiers Applications distribuées RMI Réservation de voyages Serveurs de vente Composants distribués…. EJBs

3 De RMI aux Sockets Les stubs en RMI gèrent la communication Réseaux
Le transfert de données sur le réseau oui mais COMMENT ? Et pourquoi RMI n’est pas toujours satisfaisant ???

4 Stubs et encodage des paramètres

5 RMI Architecture client serveur
Mode de communication qu’un hôte établit avec un autre hôte qui fournit un service quelconque Serveur Client opération send request application send reply « protocole d’application » 

6 Comment cela fonctionne au niveau du réseau
Rôle du stub Identification de la machine qui abrite le serveur par le client Identification du serveur sur la machine Canal de communication entre le serveur et le client Construction de la trame réseau Echange du protocole d’application

7 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’entreprise 2. 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 ?

8 Un peu de vocabulaire Client : entité qui fait l ’appel
Sockets : moyen de communication entre ordinateurs Adresses IP : adresse d’un ordinateur Serveur : entité qui prend en charge la requête Serveur de noms (DNS, LDAP) : correspondances entre noms logiques et adresses IP (Annuaire) Port : canal dédié à un service Protocole : langage utilisé par 2 ordinateurs pour communiquer entre eux

9 Adresse Internet et Port
attribuée à chaque nœud du réseau série d ’octets dont la valeur dépend du type de réseau associée à un nom logique (Domain Name Server) Chaque hôte possède environ ports Port canal dédié à un service spécifique 80 pour le service http 25 pour le service SMTP TCP implique une file d’attente par connexion UDP implique une file d’attente unique pour le port

10 Exemples d ’adresses Internet
oscar.essi.fr oscar accueil.essi.fr accueil compta.essi.fr compta www-local.essi.fr www-local pcprofs.essi.fr pcprofs ada.essi.fr ada macserver.essi.fr macserver demo.essi.fr demo bibli.essi.fr bibli sfe-srv.essi.fr sfe-srv sfe bde.essi.fr bde niv1a.essi.fr niv1a dessi.essi.fr dessi jessica.essi.fr jessica print2 ypcat hosts sous linux

11 Exemples d ’adresses Essi : 157.169 I3S: 134.59 serveurs : 25
news-srv.essi.fr news-srv www-srv.essi.fr news dolphin.unice.fr essi2.essi.fr loghost essi2 Essi : I3S: serveurs : 25 Administration : 1 …….

12 Ports réservés 1 à 1024 services fondamentaux (administrateurs)
(sous unix cf. le fichier /etc/services, ypcat services) 1025 à 5000 disponibles pour les utilisateurs TCP Serveur FTP : 21 Serveur Telnet : 23 Serveur SMTP : 25 UDP Agent SNMP : 161 Logger SNMP : 162 …. Serveur multi processus Applications transactionnelles

13 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) Gestion similaire des entrées sorties standard (écran, clavier) et des fichiers

14 Un socket : une entrée sortie dédiée au réseau
Gestion similaire des entrées sorties standard (écran, clavier) et des 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 (ou BufferedReader) ATTENTION aux méthodes deprecated

15 Plus précisément un socket
Plusieurs types de sockets : pour la communication par flot de données - fortement connectée - synchrone - type client-serveur pour communication réseau par message - en mode datagramme - en mode déconnecté pour communication réseau par diffusion

16 Contexte : modèle OSI Couche Transport pour transporter les données
en mode connecté : Transmission Control Protocol en mode déconnecté : User Datagram Protocol Mode connecté vs mode non connecté rester en ligne pour demander plusieurs services ou rappeler l’entreprise pour chaque nouvelle requête Couche communication pour connecter 2 machines distantes : Internet Protocol

17 Exemples d’applications
Un exemple : le service SMTP Un serveur d’Echo Gestion simultanément de plusieurs clients ( ligne non occupée) Demande de citations : une communication à base de messages Diffusion de citations : Communication Multicast (réunion téléphonique)

18 Sockets en Java ? BSD sockets UNIX au dessus de TCP ou UDP
Une infrastructure puissante et flexible pour la programmation réseau En Java toutes les classes relatives aux sockets sont dans le package java.net

19 Le Package net Des Exceptions Des entrées Sorties Des Sockets …...
Plusieurs hiérarchies de classes

20 Des types de Sockets Object ServerSocket DatagramSocket
HttpAwareServerSocket DatagramSocket MulticastSocket Socket HttpSendSocket WrappedSocket

21 Des exceptions Exception IOException SocketException ProtocolException
UnknownHostException UnknownServiceException BindException ConnectException

22 Des Entrées Sorties Object InputStream FileInputStream
SocketInputStream OutputStream FileOutputStream SocketOutputStream

23 Autres Classes Object InetAdress DatagramPacket SocketImpl
PlainSocketImpl

24 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 la machine hôte (getLocalHost, getLocalAddress, getLocaName) Des comparateurs : égalité (equals) et type d’adresse (isMulticastAddress) …..

25 Communication Client Serveur traditionnelle Fortement connectée
Les sockets « pour RMI » Communication Client Serveur traditionnelle Fortement connectée

26 Flot de requêtes du client vers le serveur
opération Ouvrir connexion req1 application req2 req3 reqn Fermer la connexion

27 Scénario d’un serveur Créer le socket d ’entrée
Attente de données sur le flux d ’ entrée Réception et Analyse des données en entrée Calcul Construction de la réponse Ecriture sur le flux de sortie Fermer le socket d ’entrée

28 Scénario d’un client Créer le socket d ’entrée Préparer la requête
l ’envoyer sur le flux de sortie Attendre des données sur le flux d ’ entrée les lire et les traiter Fermer le socket d ’entrée

29 Socket programming Goal: learn how to build client/server application that communicate using sockets a host-local, application-created/owned, OS-controlled interface (a “door”) into which application process can both send and receive messages to/from another (remote or local) application process socket Socket API introduced in BSD4.1 UNIX, 1981 explicitly created, used, released by apps client/server paradigm two types of transport service via socket API: unreliable datagram reliable, byte stream-oriented

30 Client/server socket interaction: TCP
Server (running on hostid) Client create socket, port=x, for incoming request: welcomeSocket = ServerSocket() TCP connection setup close connectionSocket read reply from clientSocket create socket, connect to hostid, port=x clientSocket = Socket() wait for incoming connection request connectionSocket = welcomeSocket.accept() send request using clientSocket read request from connectionSocket write reply to

31 TCP et Sockets 2 classes : Socket et ServerSocket (java.net package)

32 Connexion + Marshalling
Transfert de données Connexion + Marshalling

33 Ouvrir un socket = demander à se Connecter
Dans un client identifier la machine à laquelle on veut se connecter et le numéro de port sur lequel tourne le serveur implique de créer un socket pour cette communication

34 Comment ouvrir un socket ? Se connecter
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)

35 Dans un serveur ? Accepter les connexions
Créer un objet socket pour écouter les demandes de connexion sur le numéro de port associé au service Créer un objet socket pour accepter une connexion d ’un client cet objet servira pour tous les transferts d ’information de ce client vers le serveur

36 Dans un serveur ? Accepter les connexions
ServerSocket myService; try { myService = new ServerSocket(PortNumber); } catch (IOException e) {System.err.println(e);} Création d’un objet socket pour écouter et accepter les connexions des clients Socket clientSocket = null; try {clientSocket = myService.accept();} catch (IOException e) {System.err.println(e); }

37 Comment recevoir de l ’information ?
Côté client : on doit recevoir une réponse du serveur Côté serveur : on doit lire la requête du client 1 Créer un flux d ’entrée pour le socket et lire l ’information sur le flux 2 Reconstituer les données émises ( entiers, doubles, caractères, objets) à partir des lignes de texte reçues

38 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, des doubles,des caractères... ( read, readChar, readInt, readDouble, and readLine,. )

39 Côté Serveur pour recevoir les données d’un client
DataInputStream input; try { input = new DataInputStream(clientSocket.getInputStream()); } catch (IOException e) {System.out.println(e);}

40 Comment envoyer une information ?
Côté client : pour envoyer une requête au serveur Côté serveur : pour envoyer une réponse au client 1 Créer un flux de sortie pour le socket pour écrire l’information 2 Constituer le contenu des données à émettre (transformer entiers, doubles, caractères, objets en lignes de texte)

41 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.err.println(e);} PrintStream pour afficher des valeurs des types de base (write et println) …..

42 Côté Serveur Pour envoyer des informations au client
PrintStream output; try { output = new PrintStream(clientSocket.getOutputStream()); } catch (IOException e) {System.out.println(e);} DataOutputStream : écrire des types de données primitifs; (writeBytes…) output= new DataOutputStream(clientSocket.getOutputStream());

43 Comment se déconnecter ?
Fermer correctement les flux d’entrée sortie et les sockets en cause. Côté client Côté serveur

44 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 clientSocket.close(); myService.close();

45 Comment écrire un client ?
Toujours 4 étapes Ouvrir 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é

46 Sockets (Communication Client serveur)
Le serveur est à l’écoute des requêtes sur un port particulier Un client doit connaître l’hôte et le port sur lequel le serveur écoute. Le client peut tenter une connexion au serveur Le serveur connecte le client sur un nouveau no de port et reste en attente sur le port original Client et serveur communiquent en écrivant et lisant sur un socket

47 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"); }

48 Le protocole SMTP, RFC1822/3 if (smtpSocket != null && os != null && is != null) { try{os.writeBytes("HELO\n"); os.writeBytes("MAIL From: os.writeBytes("RCPT To: os.writeBytes("DATA\n"); os.writeBytes("From: os.writeBytes("Subject: Qui est là ?\n"); os.writeBytes("Vous suivez toujours ?\n"); // message os.writeBytes("\n.\n"); os.writeBytes("QUIT");

49 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);} } } } .

50 Serveur Echo Un serveur similaire à echo ( port 7).
Reçoit un texte du client et le renvoie identique Le serveur gère un seul client.

51 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); }

52 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);} } }

53 TCP et Sockets La 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 ...

54 TCP et Sockets La 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 lequel le socket écoute, adresse à laquelle il est connecté (getPort, getInetAddress, …) des méthodes : accept pour accepter une communication avec un client, close ...

55 Applications distribuées et parallèlisme
La communication ne doit pas rester bloquée pour un client

56 Plusieurs clients application S1 application S2 Clientn Sn application
Serveur Client1 Ouvrir connexion application S1 Client2 application S2 Clientn Sn application

57 Plusieurs Clients Utiliser des threads pour accepter plusieurs clients
simultanément. Le serveur gère un thread par client

58 Quelques mots sur les Threads
Un thread permet l’exécution d’un programme. Une application peut avoir de multiples threads qui s ’exécutent concurremment (Chaque thread a une priorité). Chaque thread a un nom. Plusieurs threads peuvent avoir le mê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 surcharger la 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 donc la méthode run. Une instance de la classe peut être allouée, passée comme argument à la création d’un thread et démarrée.

59 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();

60 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();

61 Ce que RMI ne sait pas vraiment faire ?
Communication asynchrone par messages Communication par diffusion

62 Communication par message : Envoi de datagrammes
Serveur Client opération req1 application rep1 reqn repn

63 Exemple Un serveur de citation qui écoute un socket type datagram et
envoie une citation si le client le demande Un client qui fait simplement des requêtes au serveur ATTENTION Plusieurs firewalls et routeurs sont configurés pour interdire le passage de paquets UDP

64 Scénario d’un serveur Créer le socket d ’entrée
Création d ’un paquet d ’entrée Attente de données en entrée Réception et Analyse des données en entrée Calcul Création d’un paquet de sortie Préparation et Envoi de la réponse Fermer le socket d ’entrée

65 Scénario d’un client Créer le socket d ’entrée
Créer un paquet de sortie Préparer et Envoyer une requête Créer un paquet d ’entrée Attendre des données en entrée les recevoir et les traiter Fermer le socket d ’entrée

66 Socket programming with UDP
UDP: no “connection” between client and server no handshaking sender explicitly attaches IP address and port of destination server must extract IP address, port of sender from received datagram UDP: transmitted data may be received out of order, or lost application viewpoint UDP provides unreliable transfer of groups of bytes (“datagrams”) between client and server

67 Client/server socket interaction: UDP
Server (running on hostid) create socket, clientSocket = DatagramSocket() Client Create, address (hostid, port=x, send datagram request using clientSocket create socket, port=x, for incoming request: serverSocket = DatagramSocket() read request from serverSocket close clientSocket read reply from clientSocket write reply to serverSocket specifying client host address, port umber

68 Datagrammes UDP et Sockets
Datagramme = un message indépendant envoyé sur le réseau arrivée, temps d’arrivée et contenu non garantis 2 classes : DatagramPacket et DatagramSocket packages d’implémentation de communication via UDP de datagrammes

69 Une Application Client Serveur
Le serveur reçoit en continu des paquets mode datagramme sur un socket un 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 paquet datagramme au serveur indiquant qu’il souhaite recevoir une citation et attend en réponse un paquet du serveur.

70 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.

71 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 serveur de 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 contient une liste de citations ( une citation par ligne)

72 La méthode RUN implémentation du thread
contient une boucle qui tant qu’il y a des citations dans le fichier attend 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 le DatagramSocket 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);

73 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 citations on ferme le socket de communication. socket.close();

74 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 serveur if (args.length != 1) { System.out.println("Usage: java QuoteClient <hostname>"); return; }

75 La partie principale du main
Création d ’un DatagramSocket DatagramSocket 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

76 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 se déconnecter, pour envoyer un paquet datagramme, pour un recevoir un paquet datagramme (connect, disconnect, send, receive)

77 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…)

78 Petite comparaison UDP TCP

79 Services provided by Internet transport protocols
UDP service: unreliable data transfer between sending and receiving process does not provide: connection setup, reliability, flow control, congestion control, timing, or bandwidth guarantee Q: why bother? Why is there a UDP? TCP service: connection-oriented: setup required between client, server reliable transport between sending and receiving process flow control: sender won’t overwhelm receiver congestion control: throttle sender when network overloaded does not providing: timing, minimum bandwidth guarantees

80 Transport service requirements of common apps
Application file transfer Web documents real-time audio/video stored audio/video interactive games financial apps Data loss no loss loss-tolerant Bandwidth elastic audio: 5Kb-1Mb video:10Kb-5Mb same as above few Kbps up Time Sensitive no yes, 100’s msec yes, few secs yes and no

81 Internet apps: their protocols and transport protocols
Application layer protocol smtp [RFC 821] telnet [RFC 854] http [RFC 2068] ftp [RFC 959] proprietary (e.g. RealNetworks) NSF (e.g., Vocaltec) Underlying transport protocol TCP TCP or UDP typically UDP Application remote terminal access Web file transfer streaming multimedia remote file server Internet telephony

82 Communication par diffusion : Multicast
Serveur Client1 application Gr Client2 application Clientn application

83 Ouvrir un socket = demander à se Connecter
Les clients demandent seulement à joindre un groupe

84 Exemple de multicast Un serveur de citation qui envoie une citation toutes les minutes à tous les clients qui écoutent (multicast)

85 Scénario d’un serveur Créer le socket d ’entrée
Créer un paquet de sortie Préparer et Envoyer une donnée Fermer le socket d ’entrée

86 Scénario d’un client Créer le socket d ’entrée
Création d ’un paquet d ’entrée Attente de données en entrée Réception et traitement des données en entrée Fermer le socket d ’entrée

87 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)

88 Multicast: MulticastSocket
Type de socket utilisé côté client pour écouter des paquets que le 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 MulticastServerThread qui contient le cœur du serveur. import java.io.*; public class MulticastServer { public static void main(String[] args) throws IOException { new MulticastServerThread().start(); }

89 public class MulticastServerThread extends QuoteServerThread {
... } utilisation du constructeur par héritage et héritage de variables et de la méthode getNextQuote

90 Une nouvelle méthode RUN
public 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(" "); 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();}

91 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 " " 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 " ".

92 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 " " 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 à partir de données du client sur un MulticastSocket. Il aurait pu utiliser aussi un MulticastSocket. Le socket utilisé par le serveur pour envoyer le DatagramPacket n’est pas important. Ce qui est important pour le broadcast est d’adresser l’information contenue dans le DatagramPacket, et le socket utilisé par le client pour l’écouter.

93 MulticastSocket socket = new MulticastSocket(4446);
InetAddress group = InetAddress.getByName(" "); 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();

94 Synthèse Client Serveur TCP aSocket aServerSocket connecté write read
I/O Stream I/O Stream TCP aSocket aServerSocket connecté write read read write UDP aDatagramSocket aDatagramSocket non connecté send receive receive send Multicast aMulticastSocket aDatagramSocket/ aMulticastSocket aDatagramPacket

95 Définir un nouveau type de socket
Pourquoi ? Préparer les données avant de les envoyer Préparer les données reçues Exemple Java RMI Sockets spécialisées (marshalling et unmarshalling) Images : Compression et Décompression Comment ? En spécialisant les classes de base

96 Comment Définir un nouveau type de Sockets
La classe CompressionSocket et ses classes relatives 4 é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 surcharger getInputStream, getOutputStream et close. 4. Etendre java.net.ServerSocket Implémenter le constructeur et surcharger accept pour créer un socket du bon type.

97 Un nouveau Package

98 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 Beans et JINI …..


Télécharger ppt "Programmation Réseaux Illustration : Les Sockets en Java"

Présentations similaires


Annonces Google