Vous êtes sur la page 1sur 93

Programmation Réseaux

Illustration : Les Sockets en Java

À travailler seuls

Concepts généraux
Mohamed Mediouni( Ecole Nationale
Mise en œuvre Java d’Ingénieurs de Tunis (ENIT)).
(mohamedmediouni1@hotmail.com)
Téléphone :+21622582534

Enseignement Réseau à l’ESSI

Couches Réseaux : protocoles TCP – UDP

Programmation Réseaux
Sockets Java et C

Introduction aux applications réparties

Programmation par Composants
Expériences Industrielles
Administration et sécurité des réseaux
Réseaux sans fil
Applications Temps Réel

Questions préliminaires

• Différences entre les protocoles de transport
TCP et UDP ?
• Utilisation des adresses Internet ?
• Utilisation des ports ?
• Programmation sockets : avantages et
inconvénients

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

Comment cela fonctionne au niveau du réseau – 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 .

Un peu de vocabulaire Client : ? Sockets : ? Adresses IP : ? Serveur : ? Serveur de noms (DNS. LDAP) : ? Port : ? Protocole : ? .

Programmation Socket Comment construire des applications client/server qui communiquent via les sockets socket • Deux types de transports via les socket API: Une porte à travers laquelle l’application peut – Datagramme (non à la fois envoyer et reliable) recevoir des messages d’une autre application – Orienté flux d’octets (reliable) .

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

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

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

Exemples d’applications • Un serveur d’Echo • Un exemple : le service SMTP 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) .

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

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

Des types de Sockets Object ServerSocket DatagramSocket MulticastSocket Socket .

Des exceptions Exception IOException SocketException ProtocolException UnknownHostException UnknownServiceException BindException ConnectException .

Des Entrées Sorties Object InputStream OutputStream FileInputStream FileOutputStream ObjectInputStream ObjectOutputStream FilterInputStream FilterOutputStream DataInputStream DataOutputStream .

Autres Classes Object InetAdress DatagramPacket SocketImpl PlainSocketImpl .

Java.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.net. des informations sur la machine hôte (getLocalHost. getAllByName). .. Des accesseurs en lecture : pour récupérer l’adresse IP d’une machine (getByName. getLocaName) Des comparateurs : égalité (equals) et type d’adresse (isMulticastAddress) …. getLocalAddress.

Communication Client Serveur traditionnelle Fortement connectée .

Flot de requêtes du client vers le serveur Point de vue application TCP fournit un transfert fiable. conservant l’ordre de transfert des octets (“pipe”) entre le client et le serveur Serveur Client Ouvrir connexion req1 req2 application req3 reqn opération Fermer la connexion .

Programmation socket avec TCP Le Client doit contacter le • Lorsque le client crée le socket: serveur le client TCP établit une • Le processus serveur doit connexion avec le serveur TCP être en train de s’exécuter • Lorsque le client le contacte le • Le serveur doit avoir créé un serveur TCP crée une nouvelle socket qui devient le point d’entrée des clients socket pour que le processus serveur communique avec le Le Client contacte le serveur en client • Créant un socket TCP client- localement – Permet de parler avec • Spécifiant l’adresse et le no plusieurs clients de port number du processus serveur .

Scénario d’un serveur pour un client Créer le socket de communication avec le client 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 de communication .

Scénario d’un client Créer le socket de connexion avec le serveur Attendre que la connexion soit établie Préparer la requête Récupérer la socket de l’envoyer sur le flux de sortie communication Attendre des données sur le flux d’ entrée les lire et les traiter Fermer le socket .

wait for incoming connection request connection setup connect to hostid.accept() Socket() send request using read request from clientSocket connectionSocket write reply to connectionSocket read reply from clientSocket close connectionSocket close clientSocket Serveur (s’exécutant sur l’hôte) Client . port=x. port=x connectionSocket = clientSocket = welcomeSocket. Interaction Client/server : socket TCP create socket. for incoming request: welcomeSocket = ServerSocket() TCP create socket.

net package) pour les canaux de communication 2 classes pour le flot de données XInputStream et XOutputStream . TCP et Sockets 2 classes : Socket et ServerSocket (java.

Transfert de données Connexion + « Marshalling » .

Accepter les connexions Dans un serveur ? 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 .

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

Demander à se Connecter = ouvrir un socket 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 .

PortNumber). Se connecter Comment ouvrir un socket ? Dans un client Socket myClient. } Machine name : machine à laquelle on veut se connecter PortNumber port sur lequel tourne le serveur (> 1023) . } catch (IOException e) { System. try { myClient = new Socket("Machine name".println(e).out.

Comment recevoir de l ’information ? Côté serveur : on doit lire la requête du client Côté client : on doit recevoir une réponse du serveur 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 .

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

readInt.out. ( read. Créer un Input Stream? Côté client : pour recevoir une réponse du serveur try {input = new DataInputStream(myClient..getInputStream()). readDouble. ) .} catch (IOException e) {System. readChar. des doubles. and readLine..des caractères. des entiers.println(e).} DataInputStream : lire des lignes de texte..

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

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

} PrintStream pour afficher des valeurs des types de base (write et println) ….} catch (IOException e) {System.err..getOutputStream(). try {output = new PrintStream(myClient. Comment créer un Output Stream? Côté client : pour envoyer une information au serveur (PrintStream ou DataOutputStream) PrintStream output.println(e). .

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

close().close(). Côté serveur output. Comment fermer un socket ? Fermer les output et input stream avant le socket. . myService.close(). clientSocket.close().close(). Côté client output.close(). myClient.close(). input. input.

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 .

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

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

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

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é

err.err.io.println("Don't know about host: hostname"). } catch (UnknownHostException e) { System. Client SMTP (Simple Mail Transfer Protocol). // input stream try { smtpSocket = new Socket("hostname". } catch (IOException e) { System. // le socket client DataOutputStream os = null. } .*.println("Couldn't get I/O for the connection to: hostname"). 25).getInputStream()). import java.*. public class smtpClient { public static void main(String[] args) { Socket smtpSocket = null. is = new DataInputStream(smtpSocket. // output stream DataInputStream is = null.net. os = new DataOutputStream(smtpSocket.getOutputStream()). import java.

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

err.err.println("Trying to connect to unknown host: " + e). } catch (IOException){ System. is.}} os. String responseLine.out. SMTP // attente de "Ok" du serveur SMTP.indexOf("Ok") != -1) {break.close().close().println("Server: " + responseLine). if (responseLine.} }} } .println("IOException: " + e). while ((responseLine = is.close(). } catch (UnknownHostException e) { System. smtpSocket.readLine()) != null) { System.

. getInetAddress... no de port associé. …) des méthodes : accept pour accepter une communication avec un client. adresse à laquelle il est connecté (getPort. . close . TCP et Sockets La classe ServerSocket des constructeurs : par défaut. des accesseurs en lecture : no de port sur lequel le socket écoute. + taille de la liste de clients en attente + adresse..

. input et output Stream associés (getPort. getLocalPort. no de port et adresse à laquelle il est lié. getOutputStream…) des méthodes : close . . getInetAddress. TCP et Sockets La classe Socket : une batterie de constructeurs : par défaut. no de port + adresse / nom de machine et service distante. getLocalAddress. 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 + adresse locale.. getInputStream.

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

Programmation socket avec TCP Le Client doit contacter le • Lorsque le client crée le socket: serveur le client TCP établit une • Le processus serveur doit connexion avec le serveur TCP être en train de s’exécuter • Lorsque le client le contacte le • Le serveur doit avoir créé un serveur TCP crée une nouvelle socket qui devient le point d’entrée des clients socket pour que le processus serveur communique avec le Le Client contacte le serveur en client • Créant un socket TCP client- localement – Permet de parler avec • Spécifiant l’addresse et le no plusieurs clients de port number du processus serveur .

for incoming request: welcomeSocket = ServerSocket() TCP create socket. port=x. wait for incoming connection request connection setup connect to hostid.accept() Socket() send request using read request from clientSocket connectionSocket write reply to connectionSocket read reply from clientSocket close connectionSocket close clientSocket Serveur (s’exécutant sur l’hôte) Client . Interaction Client/server : socket TCP create socket. port=x connectionSocket = clientSocket = welcomeSocket.

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

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

Une application peut avoir de multiples threads qui s ’exécutent concurremment (Chaque thread a une priorité). déclarer une classe qui implémente Runnable et donc la méthode run. Plusieurs threads peuvent avoir le même. Il y a 2 façons de créer un nouveau thread d’exécution. Le nom est généré si non spécifié. Chaque thread a un nom. Une instance de la sous classe peut alors être allouée et démarrer. passée comme argument à la création d’un thread et démarrée. Une instance de la classe peut être allouée. . Quelques mots sur les Threads Un thread permet l’exécution d’un programme. déclarer une sous classe de Thread et surcharger la méthode run.

start().minPrime = minPrime. PrimeThread(long minPrime) { this. p.Un thread qui calcule des primes class PrimeThread extends Thread { long minPrime. } } PrimeThread p = new PrimeThread(143). } public void run() { // compute primes larger than minPrime .. ..

create a thread to deal with the client . end while . Scénario du Serveur Multithreadé while (true) { accept a connection .

printStackTrace().close().getOutputStream(). in. socket.socket = socket. …… } out. true). this. BufferedReader in = new BufferedReader( new InputStreamReader( socket. } public void run() { try { PrintWriter out = new PrintWriter(socket.public class MultiServerThread extends Thread { private Socket socket = null. public MultiServerThread(Socket socket) { super("MultiServerThread").close().getInputStream())). } catch (IOException e) { e.close(). } } } .

} while (listening) new MultiServerThread(serverSocket.start().accept()).println("Could not listen on port: 4444. } catch (IOException e) { System.exit(-1). try { serverSocket = new ServerSocket(4444). System."). } } . boolean listening = true.err. serverSocket.public class MultiServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null.close().

Communication asynchrone par messages Communication par diffusion .

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

Programmation Socket avec UDP UDP: pas de “connexion” entre le client et le serveur application viewpoint • Pas de lien privilégié entre le UDP fournit un transfert non fiable de groupes d’octets client et le serveur (“datagrammes”) • L’emetteur attache l’adresse entre un client et le serveur IP et le port pour le retour. • Le serveur doit extraire l’adresse IP et le port de l’expéditeur à partir du datagramme reçu UDP: les données transmises peuvent être reçues dans le désordre ou perdues .

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

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 .

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 .

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 .

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 .

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

La classe QuoteServer socket = new DatagramSocket(4445). } } Le constructeur ouvre aussi un BufferedReader sur un fichier qui contient une liste de citations ( une citation par ligne) . 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. " + "Serving time instead. } catch (FileNotFoundException e) System.").txt")).err.println("Couldn't open quote file.

int port = packet. buf.getPort(). DatagramPacket packet = new DatagramPacket(buf.send(packet). packet = new DatagramPacket(buf. En réponse une citation est mise dans un DatagramPacket et envoyée sur le DatagramSocket au client demandeur.receive(packet). String dString = null. . else dString = getNextQuote(). socket. socket. if (in == null) dString = new Date(). buf.getBytes().toString().length. port). buf = dString.getAddress(). suite 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]. InetAddress address = packet. address.length).

.close(). Lorsque le serveur a lu toutes les citations on ferme le socket de communication. 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. socket.

InetAddress address. Le client a besoin pour s ’exécuter du nom de la machine sur laquelle tourne le serveur if (args. La classe QuoteClient envoie une requête au QuoteServer.length != 1) { System.out. DatagramPacket packet. attend la réponse et affiche la réponse à l’écran. Variables utilisées : int port.println("Usage: java QuoteClient <hostname>"). return. DatagramSocket socket = null. byte[] sendBuf = new byte[256]. } .

address. buf.getByName(args[0]). InetAddress address = InetAddress. socket.send(packet). DatagramPacket packet = new DatagramPacket(buf.length. La partie principale du main Création d ’un DatagramSocket DatagramSocket socket = new DatagramSocket(). Ensuite le client récupère une réponse et l’affiche . 4445). Le constructeur lie le Socket à un port local libre Le programme envoie une requête au serveur byte[] buf = new byte[256].

connecté. taille du buffer reçu ou envoyé (getInetAddress. getPort. pour se déconnecter. pour envoyer un paquet datagramme. pour un recevoir un paquet datagramme (connect. disconnect. getReceivedBufferSize. Classe DatagramSocket Des constructeurs : par défaut. send. est connecté. getLocalPort. getLocalAddress. le no port auquel il est lié. + no port + Adresse Inet Des accesseurs en lecture : adresse à laquelle le socket est lié. getSendBufferSize…) Des méthodes : pour se connecter à une adresse. receive) .

getData. getPort. la donnée transmise (getAddress. getLength…) . le no port à laquelle le paquet est envoyé. Classe DatagramPacket Des constructeurs : buffer + longueur de buffer + adresse destination + port… Des accesseurs en lecture : adresse à laquelle le paquet est envoyé.

Petite comparaison UDP TCP .

reliability. Services fournis par les protocoles de transport Internet Service TCP : Service UDP : • connection-oriented: setup • unreliable data transfer required between client. or • congestion control: throttle sender bandwidth guarantee when network overloaded • does not providing: timing. server between sending and receiving • reliable transport between process sending and receiving process • does not provide: connection • flow control: sender won’t setup. minimum bandwidth guarantees . flow control. overwhelm receiver congestion control. timing.

Exigence de transport des applications communes Application Data loss Bandwidth Time Sensitive file transfer no loss elastic no e-mail no loss elastic no Web documents loss-tolerant elastic no real-time audio/video loss-tolerant audio: 5Kb-1Mb yes. 100’s msec video:10Kb-5Mb stored audio/video loss-tolerant same as above yes. 100’s msec financial apps no loss elastic yes and no . few secs interactive games loss-tolerant few Kbps up yes.

. RealNetworks) remote file server NSF TCP or UDP Internet telephony proprietary typically UDP (e. Vocaltec) .g.g. Protocoles Internet des applications et protocoles de transport associés Application Underlying Application layer protocol transport protocol e-mail smtp [RFC 821] TCP remote terminal access telnet [RFC 854] TCP Web http [RFC 2068] TCP file transfer ftp [RFC 959] TCP streaming multimedia proprietary TCP or UDP (e.

Communication par diffusion : Multicast Client1 Serveur Client2 Gr Clientn .

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

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

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 .

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 .

Classe MulticastServer Des constructeurs : par défaut. leaveGroup) . joinGroup. pour joindre ou quitter un groupe (send. port à utiliser Des accesseurs en lecture : adresse du groupe (getInterface…) Des méthodes : pour envoyer un paquet datagramme.

Une extension du QuoteServer : broadcast à intervalle régulier à tous ses clients . . Multicast: MulticastSocket Type de socket utilisé côté client pour écouter des paquets que le serveur « broadcast » à plusieurs clients.

4446). DatagramPacket packet.getByName("230.length. group. buf.. moreQuotes = false.send(packet).printStackTrace(). try {sleep((long)Math.random() * FIVE_SECONDS). buf = dString.getBytes(). if (in == null) dString = new Date(). Cœur du serveur while (moreQuotes) { try { byte[] buf new byte[256].} } socket. InetAddress group = InetAddress. packet = new DatagramPacket(buf.} .toString(). else dString = getNextQuote(). } catch (InterruptedException e) { } } catch (IOException e) { e. socket..0.0.just send a quote String dString = null.1").close(). // don't wait for request.

0.0. L’adresse InetAddress "230.0. 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).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.1".

. et le socket utilisé par le client pour l’écouter. Il aurait pu utiliser aussi un MulticastSocket. le programme du client doit créer son MulticastSocket avec ce no.0. Le serveur utilise un DatagramSocket pour faire du broadcast à partir de données du client sur un MulticastSocket.1" le client adresse la méthode joinGroup du MulticastSocket avec l’adresse d’identification du groupe. Ce qui est important pour le broadcast est d’adresser l’information contenue dans le DatagramPacket. Un nouveau Client Pour écouter le port 4446. Le socket utilisé par le serveur pour envoyer le DatagramPacket n’est pas important. Pour être membre du groupe "230.0.

getData()). for (int i = 0.1").receive(packet). i++) { byte[] buf = new byte[256].out.println("Quote of the Moment: " + received). } socket. String received = new String(packet. i < 5. .joinGroup(group). socket. socket. InetAddress group = InetAddress.MulticastSocket socket = new MulticastSocket(4446). packet = new DatagramPacket(buf. socket.leaveGroup(group). buf.length).0. DatagramPacket packet.0.close().getByName("230. System.

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

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 .

• Channels of various types. which represent connections to entities capable of performing I/O operations. non blocking I/O facility. which together with selectable channels define a multiplexed. and • Selectors and selection keys. Un nouveau Package : java. • Charsets and their associated decoders and encoders.nio • The central abstractions of the NIO APIs are: • Buffers. which translate between bytes and Unicode characters. . which are containers for data.

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