Sunteți pe pagina 1din 19

SRCS : Systmes Rpartis Client/Serveur

Java pour la programmation client/serveur


1. Rappels sur Java
a. b. c. Java et les machines virtuelles Concepts de base Annexe : pense-bte

Java pour la programmation client/serveur


Gal Thomas gael.thomas@lip6.fr

2. Entres/sorties en Java 3. Programmation concurrente


a. b. c. d. e. a. b. c. d.
09/02/2009

!"#$% $&'(&)(*+&'$(,-(./+)-0(1-/)2&'/-'3

Introduction Les tches en Java Moniteurs dobjets Envoi dvnements entre tches Java tude de deux patterns Introduction et rappels sur les sockets Sockets en mode flux Sockets en mode datagram Sockets en mode multicast
Master SAR - M1 SRCS - Java 2

Universit Pierre et Marie Curie Master Informatique M1 Spcialit SAR

4. Programmation rseau

Java pour la programmation client/serveur

1.a. Java et les machines virtuelles


Objectifs de Java
! Masquer lhtrognit des machines et des OS
" Un binaire sexcute lidentique sur nimporte quelle machine

1. Rappels sur Java


a. Java et les machines virtuelles b. Concepts de base c. Annexe : pense-bte

! Fournir un langage de programmation orient objet ! Fournir un ensemble de bibliothques systmes dfinies par des spcifications (J2ME, J2SE, J2EE)

Principe :
Programme source Java public class Bip { public void m() {} } compilation Interprtation ou assemblage du bytecode

ByteCode Java indpendant De los et de la machine 0xCAFEBABE Machine Virtuelle Java Systme dexploitation Machine (CPU)

09/02/2009

Master SAR - M1 SRCS - Java

09/02/2009

Master SAR - M1 SRCS - Java

1.a. Java et les machines virtuelles


Historique
1991 : J. Gosling, B. Joy, A. Van Hoff proposent OAK 1993 : JDK 1.0, lien avec Web (applet) 1996 : Java Beans 1997 : JDK 1.1 Enterprise Java Beans, JavaCard, Java OS 1998 : Java 2 (JDK 1.2, 1.3, 1.4) 2004 : Java 5 (JDK 1.5) 2006 : Java 6

1.a. Java et les machines virtuelles


Java = 3 branches distinctes (compilo+VM+bibliothques)
! JME : Java Micro Edition pour les systmes embarqus ! JSE : Java Standard Edition pour le ordinateurs de bureau ("le" JDK) ! JEE : Java Enterprise Edition pour les serveurs (inclus J2SE)

Nombreux outils
! ! ! ! Dveloppement : Eclipse, JBuilder, NetBeans, emacs/jde VM : Sun, Kaffe, Jikes RVM, SableVM, IBM, Compilo : Sun, jikes, gcj, Manipulation du bytecode : ASM, BCEL, Javassist,

Nombreuses technologies pour les applications client/serveur


JSP, servlet, JDBC, JMS, JavaIDL, JavaMail, RMI, JCE, JAAS, JNDI, JTS, JTA, JMX, JPA

09/02/2009

Master SAR - M1 SRCS - Java

09/02/2009

Master SAR - M1 SRCS - Java

1.b. Concepts de base


Classe : lment de conception modlisant une entit du problme rsoudre, contient
! Les donnes de lentit (variable) ! Les mthodes manipulant ces donnes (code) " But : regrouper dans une mme entit les donnes et leurs mthodes ! seules les mthodes sont visibles (ce que fait une classe versus comment est construite une classe)
Compte champs mthodes propritaire: String solde: double crediter(montant: double): void + code dbiter(montant: double): boolean + code

1.b. Concepts de base


2 types de champs et de mthodes Champs et mthodes de classe :
! Mot cl : static ! Partags par toute les instances
Classe X static int a = 22; x1.a = X.a = x2.a Instance x1 de X int b = 37; Instance x2 de X int b = 42;

Champs et mthodes dinstance :


! Mot cl : aucun (dfaut) ! Lis une instance

Objet : instance dune classe


! lment dexcution possdant les proprits de la classe
09/02/2009

Remarque :
Propritaire: "Bob" Solde: 187.27 Propritaire: "Bill" Solde: 897.09
7

! Une mthode dinstance peut manipuler des champs de classe et dinstance ! Une mthode de classe ne peut manipuler que des champs de classe
09/02/2009 Master SAR - M1 SRCS - Java 8

Master SAR - M1 SRCS - Java

1.b. Concepts de base


Instanciation et gestion de la mmoire Instancier une classe X : appel new X(arguments)
! Allocation de lespace mmoire de X ! Appel de la mthode spciale X.X(arguments) appele constructeur ! Retourne une rfrence vers linstance de X ! Une rfrence nest pas un pointeur (pas darithmtique)

1.b. Concepts de base


Java par lexemple (1/2)
public class Compte { private String proprietaire; classe private double solde; // private ! invisible hors de la

public Compte(String proprietaire) { // Constructeur, appel lors de la cration this.proprietaire = proprietaire; this.solde = 0; // this rfrence notre instance } public void crediter(double montant) { solde += montant; } public boolean debiter(double montant) { // public : visible en dehors de la classe if(solde >= montant) { solde -= montant; return true; } else return false; }}
9 09/02/2009 Master SAR - M1 SRCS - Java 10

Supprimer une instance de X : automatique


! Suppression automatique dune rfrence ds quelle nest plus rfrence ! Aucun contrle sur linstant de suppression! ! Appel automatique de X.finalize() si dfinie

09/02/2009

Master SAR - M1 SRCS - Java

1.b. Concepts de base


Java par lexemple (1/2) Remarque : dmarrage dune application Java
Appel de java Pgm o Pgm est une classe Java ! Appel de la mthode public static main(String args[])
public class TestCompte { private static Compte bob; // static ! champs partag entre toutes les instances private static Compte bill; public static void main(String args[]) { // type [] = tableau bob = new Compte("Bob"); // cration du Compte de Bob bill = new Compte("Bill"); // cration du compte de Bill bob.credite(187.12); } }

1.b. Concepts de base


Hritage : relation de spcialisation dune classe
! Une classe fille hrite dune classe parente
Hrite des donnes et des mthodes de son parent Animal Mollusque Dauphin Poisson Sardine

! Mot cl : extends

Mammifre Chat Homme

Interface : dfinition abstraite dune classe


Lien avec la notion dAPI

Pas dhritage multiple en Java ! Ne possde que des mthodes ! Dcouple la dfinition dune classe de son implantation

" Une interface peut tre implante (mot cl implements) par plusieurs classe " Une classe peut possder plusieurs interfaces

Interface : notion fondamentale pour sparer client et serveur


11 09/02/2009 Master SAR - M1 SRCS - Java 12

09/02/2009

Master SAR - M1 SRCS - Java

1.b. Concepts de base


Notion dexception
! Exception = Instance dune classe hritant de la classe Exception ! Peut tre leve et attrape

1.b. Concepts de base


Exception par lexemple
public class MonExcp extends Exception { }
Indique que f est susceptible de lever une exception du type MonExcp public class Test { void f() throws MonExcp { throw new MonException(); } void g() { Lve une exception du type MonExcp try { f(); System.out.println("Code jamais excut!!!"); } catch(MonExcp e) { System.err.println("Exception intercepte : " + e); } } Lexcution reprend ici aprs la leve de lexception }

Lever une exception : mot cl throw


! Indique un fonctionnement anormal du programme (erreur) ! Interrompt le fil dexcution normal de lapplication ! Reprise de lexcution
" Un point o lexception est attrape si existe " Jamais sinon (interruption de lapplication)

! Notion proche de lenvoie dun signal soit mme (raise)

Attraper une exception : bloc cl try { } catch(Type t) { }


! Interception de la leve dune exception et reprise de lexcution
" ayant la classe Type " Leve dans un des sous-appels contenu dans le bloc try { }
09/02/2009 Master SAR - M1 SRCS - Java 13

09/02/2009

Master SAR - M1 SRCS - Java

14

1.b. Concepts de base


Notion de package
! Espace de nommage regroupant des
" Sous-packages (structure hirarchique) " Classes ou des interfaces

1.c. Pense-bte
CLASSPATH : liste des rpertoires dans lesquels la VM va chercher des .class? Comment compiler un fichier Toto.java?
javac Toto.java ! cration de Toto.class java Toto

Comment excuter Toto.class? Quest ce quun package?


Un ensemble de classes regroupes dans un espace de noms package toto; public class Bip { } ! la classe Bip est rfrence par toto.Bip

! Sparateur de package : le "."


package bip.bap import blap; //! importe tous les noms contenu dans le package blap class X { void f() { System.out.println("blob.Y.y: " + blob.Y.y); }

Comment afficher un message?


System.out.println("Hello, World!!!");

Comment faire une boucle? Un if?


for(int i=0; i<255; i++) { } if(cond) { si vrai } else { si faux }

Quest ce quune exception? mcanisme de retour anticip dune mthode pour signaler un comportement anormal Comment traiter une exception? try { m(); } catch(MyException e) { System.out.println("Ce nest pas normal"); e.printStackTrace(); }

09/02/2009

Master SAR - M1 SRCS - Java

15

09/02/2009

Master SAR - M1 SRCS - Java

16

1.c. Pense-bte
Comment lever une exception? throw new MyException("Yeah!"); Comment passer un paramtre une application Java java monpackage.Maclass arg0 arg1 arg2 Comment positionner une proprit java Dfile.separator=\ Comment consulter une proprit String prop = System.getProperty("file.separator", "valeur par dfaut");

Java pour la programmation client/serveur

2. Entres/Sorties en Java

09/02/2009

Master SAR - M1 SRCS - Java

17

09/02/2009

Master SAR - M1 SRCS - Java

18

2. Entres/sorties en Java
But : lire/crire des donnes partir dun fichier, de la mmoire, du rseau Deux API dentres/sorties
! Entres/sorties bloquantes (java.io.*) tudies dans ce cours ! Entres/sorties non bloquantes (java.nio.*) non abordes

2. Entres/sorties en Java
InputStream : lecture de donnes int read(); Lit un octet du flux Bloquant Return -1 si fin du flux
InputStream is = int i = is.read(); while(i != -1) { traitement i = is.read(); } is.close();
09/02/2009

Bloquant, binaire, par flux

OutputStream : criture de donnes void write(int b) crit un octet dans le flux

Deux faon de grer les entres/sorties


! Par paquet : metteurs et rcepteurs communiquent directement par paquets de taille fixe tudi avec UDP ! Par flux : metteurs et rcepteurs communiquent via un canal fifo, la taille des messages reus et mis nest pas la mme tudi dans ce chapitre OutputStream os = os.write(22); os.write(27); os.write(13); os.close();

Deux mode dentre/sortie


! Mode binaire : criture et lecture de donnes bruts tudi dans ce cours ! Mode caractre : criture et lecture de caractres non abord
09/02/2009 Master SAR - M1 SRCS - Java 19

22 | 27 | 13

Flux

Master SAR - M1 SRCS - Java

20

2. Entres/sorties en Java
FileInputStream : lecture de donnes partir dun fichier (hrite de InputStream) Bloquant, int read(); binaire, Lit un octet du fichier par flux
InputStream is = new FileInputStream( "/tmp/toto"); int i = is.read(); while(i != -1) { traitement i = is.read(); 22 | 27 | 13 } is.close(); Flux

2. Entres/sorties en Java
# Srialisation : reprsentation sous forme binaire dun objet Java # Utilis pour changer des objets (envoi dobjets, persistance) # Ne marche quavec des Objets implantant linterface serializable

FileOutputStream : criture de donnes dans un fichier (hrite de OutputStream) void write(int b) crit un octet dans le fichier
OutputStream os = new FileOutputStream( "/tmp/toto"); os.write(22); os.write(27); os.write(13); os.close();

InputStream ObjectInputStream Objet Java octet

OuputStream ObjectOuputStream octet Objet Java

09/02/2009

Master SAR - M1 SRCS - Java

21

09/02/2009

Master SAR - M1 SRCS - Java

22

2. Entres/sorties en Java : srialisation


Envoi et rception dobjets Java : ObjectInputStream/ObjectOutputStream
Bloquant, ObjectOutputStream : binaire, criture dobjets serialisables par flux

Java pour la programmation client/serveur

ObjectInputStream : lecture dobjets seralisables Object readObject(); Lit un objet dun flux Repose sur un InputStream
InputStream is = new ObjectInputStream(new FileInputStream( "/tmp/toto"));

3. Programmation concurrente
a. b. c. d. e. Introduction Les tches en Java Moniteurs dobjets Envoi dvnements entre tches Java tude de deux patterns

void writeObject(Object b) crit un objet dans un flux Repose sur un OutputStream

OutputStream os = new ObjectOutputStream(new FileOutputStream( "/tmp/toto")); os.writeObject(new Toto());

Object o = is.readObject();

09/02/2009

Master SAR - M1 SRCS - Java

23

09/02/2009

Master SAR - M1 SRCS - Java

24

3.a. Introduction
Processus = ensemble d'instructions + tat dexcution
(pile, registres, pc, tas, descripteurs dE/S, gestionnaires de signaux) ! ! ! !

3.a. Introduction
Intrts des threads : communication inter-processus via la mmoire
Programmation vnementielle (IHM) Entres/sorties non bloquantes Gestion de temporisateurs Servir plusieurs clients en parallle

Systme multitches : systme capable dexcuter en // plusieurs processus


! Optimisation des temps morts (idle, attente dentre/sortie) ! Utilisation multi-utilisateurs de la machine

Dfauts des threads (versus processus)


! Pas disolation : un thread corrompt la mmoire ! la mmoire est corrompue pour tous les threads ! Accs concurrent ltat : 2 threads peuvent modifier en parallle ltat ! Plus difficile programmer

Deux classes principales de processus


! Processus lourd (ou tche ou processus) : ne partage pas son tat
Sauf des espaces mmoire partags dclars explicitement (IPC System V, shm_*)

! Processus lger (ou thread) : partage son tas, ses descripteurs et ses gestionnaires

Systmes actuels : approche mixte (processus lourds et lgers)


25 09/02/2009 Master SAR - M1 SRCS - Java 26

09/02/2009

Master SAR - M1 SRCS - Java

3.b. Les Threads en Java


# 1 JVM = un processus lourd (1 unique thread "main" au dpart) # Mcanisme de threads intgrs la JVM
(native threads : mapps sur processus noyau, green threads : en mode U) ! Tous les threads Java partagent la mmoire (les objets)
Un processus lourd Gestion dune socket Gestion dune socket Gestion dun timer Gestion du clavier Ramasse-miettes main (java Main)

3.b. Les Threads en Java


Processus lger Java = classe qui implante linterface Runnable
MonThread.main() t.start();

class MonThread implements Runnable { public void run() { System.out.println("Im a thread!"); 45'-#,(67#/)6 }

t.run();

45'-#,(689(45'-#,"

N processus lgers qui partagent le tas (les objets)

Machine Virtuelle Java Systme dexploitation/CPU


09/02/2009 Master SAR - M1 SRCS - Java 27

public static void main(String args[]) { // Un thread possde optionnellement un nom symbolique Thread t = new Thread(new MonThread(), "My Thread"); // MonThread.run() est dmarr dans un nouveau thread aprs lappel de start() t.start(); System.out.println("Ce code sexcute en // de run()"); } }
09/02/2009 Master SAR - M1 SRCS - Java 28

3.b. Les Threads en Java


La classe Thread implante aussi linterface Runnable
MonThread.main() t.start(); t.run();

3.b. Les Threads en Java


Remarques
! Cration dautant de processus lgers qui ncessaire
Instances de la mme classe ou dautre classe

! A une instance correspond un processus lger unique


Appel de start() une seule fois par instance de Thread

class MonThread extends Thread { public void run() { System.out.println("Im a thread!"); }

45'-#,(67#/)6

45'-#,(645'-#,:;"

! Un thread meurt lorsque sa mthode run() se termine ! Pas de passage de paramtre directement un Thread
Passage dargument via linstance du Runnable class MonThread extends Thread { private int value; MonThread(int value) { this.value = value; } public void run() { System.out.println("value is:" + value); } public static void main(String args[]) { (new MonThread(22)).start(); } } $ Il est parfaitement absurde dappeler run() directement (ne cre pas le

public static void main(String args[]) { // MonThread sera un Thread nomm automatiquement "Thread-1" Thread t = new MonThread(); // MonThread.run() est dmarr dans un nouveau thread aprs lappel de start() t.start(); } }
09/02/2009 Master SAR - M1 SRCS - Java 29

processus lger)

09/02/2009

Master SAR - M1 SRCS - Java

30

3.b. Les Threads en Java


Synchronisation sur la terminaison dun Thread
MonThread.main() t.start(); t.run();

3.b. Les Threads en Java


Problme : terminaison et interruption des threads Java
$ Il nexiste pas dquivalent aux envois de signaux entre threads ! t.interrupt() : interrompt le thread t si
" Il excute wait(), sleep(), join() " Il effectue une entre/sortie sur un InterruptibleChannel (interface java.nio), mais ! fermeture du canal

class MonThread extends Thread { public void run() { System.out.println("Im a thread!"); }

t.join(); 67#/)6 645'-#,:;"

public static void main(String args[]) { Thread t = new MonThread(); t.start(); t.join(); // attend la fin de lexcution du Thread // (i.e la fin de lexcution de run()) } }

! Si le thread effectue une entre/sortie bloquante (java.net.*, java.io.*), il faut fermer le canal (flux, socket)

! Il nexiste pas de mthode pour interrompre un thread pendant quil effectue une entre/sortie sans fermer le canal dentre/sortie (sauf si entre/sortie avec temporisateur)
31 09/02/2009 Master SAR - M1 SRCS - Java 32

09/02/2009

Master SAR - M1 SRCS - Java

3.b. Les Threads en Java


Remarque : thread.stop() est obsolte
! Laisse les objets dans un tat incohrent
public MonThread extends Thread { public void run() { hashmap.put(elmt, value); } public static void main(String args[]) { Thread t = new MonThread(); t.start(); t.stop(); } }

3.c. Moniteurs dobjets


Accs concurrent par lexemple
class Shared { // Objet partag entre les threads int nbThread = 0; // compte le nombre de thread qui sexcutent public void register() { nbThread++; } // incrmente ce nombre public String toString() { return "nbThread: " + nbThread; } } class MonThread extends Thread { static Shared shared = new Shared();// partag par tous les threads public void run() { shared.register(); System.out.println(shared); } public static void main(String args[]) { Thread t = new MonThread(); t.start(); } }

09/02/2009

Master SAR - M1 SRCS - Java

33

09/02/2009

Master SAR - M1 SRCS - Java

34

3.c. Moniteurs dobjets


Plusieurs threads peuvent accder lobjet shared
! Problme classique daccs concurrent des variables ! Introduction de la notion de section critique nbThread reprsente le nombre de thread, incrment par chaque Thread
p1a : lit r1 p1b : r1 := r1 + 1 p1c : crit r1 45'-#,(<; Objet nbThread: 0 p2a: lit r2 p2b : r2 := r2 + 1 p2c : crit r2 45'-#,(<=

3.c. Moniteurs dobjets


Dfinition : exclusion mutuelle (smaphore une case)
Seul un processus peut acqurir lexclusion mutuelle Les autres processus sont mis en attente

Exclusion mutuelle en Java


! Matrialise par le mot cl synchronized
" Acquisition dun moniteur sur lobjet (! smaphore une case) " Le moniteur est rendu la fin du bloc synchronis

! Lexclusion mutuelle seffectue sur un objet, i.e lexclusion concerne toutes les synchronisations sur cet objet
Peut concerner des codes diffrents

Parmi les excutions possibles (<nbThread, r1, r2>)


! p1a, p1b, p1c, p2a, p2b, p2c ! p1a, p2a, p2b, p2c, p1b, p1c
09/02/2009

! nbThread = 2 (gagn %) ! nbThread = 1 (perdu &)


35

! Mthode synchronise ! acquisition dun moniteur sur un objet


" Mthode dinstance synchronise ! synchronisation sur lobjet this " Mthode de classe synchronise ! synchronisation sur lobjet java.lang.Class

<0, 0,?>, <0,1,?>,<1,1,?>,<1,1,1>,<1,1,2>,<2,1,2> <0,0,?>,<0,0,0>,<0,0,1>,<1,0,1>,<1,1,1>,<1,1,1>


Master SAR - M1 SRCS - Java 09/02/2009

Master SAR - M1 SRCS - Java

36

3.c. Moniteurs dobjets


Trois exemples totalement quivalents :
! synchronized public void register() { nbThread++; } ! public void register() { synchronized(this) { nbThread++; } } ! syncrhonized(shared) { shared.register(); }

3.d. Envoi dvnements entre tches Java


Moniteur insuffisant pour tous les types de synchronisations
! Synchronisation de threads sur un vnement ! Exclusion de type lecteur/crivain

$ Remarques : la synchronisation est utiliser intelligemment


! Un appel une mthode synchronise cote cher (3 fois plus cher) ! Lentre dans un bloc synchronis cote aussi cher ! Risque classique dinter-bloquage
P1 : synchronized(a) { synchronized(b) { } } P2 : synchronized(b) { synchronized(a) { } }

Exemple : tous les thread attendent que tous les thread soient dmarrs (attente dun vnement)
! Threads : attendent que le boolean partag ready passe true while(!shared.ready) { ??? dort(); ??? } ! Main : dmarre les threads est passe le boolean ready true shared.ready = true; $ Problme : comment viter lattente active (i.e comment endormir les thread)

Autres remarques
La JVM garantie un accs atomique tous les types primitifs sauf long et double
09/02/2009 Master SAR - M1 SRCS - Java 37

09/02/2009

Master SAR - M1 SRCS - Java

38

3.d. envoi dvnements entre tches Java


Quatre primitives de la classe Object pour viter lattente active
! ! ! ! wait() : attend un notify() ou un notifyAll(); wait(long ts) : attend un notify()/notifyAll() ou ts milli-secondes notify() : rveille un de thread qui fait un wait() notifyAll() : rveille tous les threads qui font des wait() ! ! ! ! !

3.d. envoi dvnements entre tches Java


Wait() :
Mise en attente du thread Relchement du moniteur (du verrou) Attente du notify() ou notifyAll() Attente de la r-aquisition du moniteur (du verrou) Reprise de laccs exclusif

Ces mthodes ncessitent un accs exclusif lobjet ! utiliser avec mthode ou bloc synchronized
! synchronized(obj) { obj.wait(); } ! synchronized(obj) { obj.notify(); }

Notify() :
! Si il existe des threads qui excute wait(), rveilles en un unique ! Sinon, ne fait rien

Ces mthodes peuvent tre interrompues (Thread.interrupt()) entourer dun try { .. } catch(InterruptedException e) { }
09/02/2009 Master SAR - M1 SRCS - Java 39

A mettre en // des variablesconditions Posix (pthread_cond)

09/02/2009

Master SAR - M1 SRCS - Java

40

3.d. envoi dvnements entre tches Java


class Shared { private boolean ready = false; public synchronized void waitReady() { while(!ready) try { wait(); } catch(InterruptedException e) {} } public synchronized void noteReady() { ready = true; notifyAll(); } } public class Main { private static Shared shared = new Shared(); public void run() { shared.waitReady(); } public static void main(String args[]) { start threads ; shared.noteReady(); } }

3.d. envoi dvnements entre tches Java


Schma gnral de la synchronisation par vnement Thread qui attend un vnement synchronized(this) { while(!condition()) try { wait(); } catch(InterruptedException e) {} } Thread qui gnre lvnement synchronized(this) { condition passe true; notifyAll(); ou notify(); }
41 09/02/2009 Master SAR - M1 SRCS - Java 42

09/02/2009

Master SAR - M1 SRCS - Java

3.e. tude de deux patterns


Problme : traitement en // de plusieurs clients par un serveur
! Cration et destruction dun thread par client (lent) ! Pas de limite au nombre de thread (serveur croul)

3.e. tude de deux patterns


Thread pool[]; Fifo prochainClients; boolean cont = true; public void run() { Client client = null; while(cont) { synchronized(pool) { while(prochainClients.isEmpty()) pool.wait(); client = prochainClients.pop(); prochainClient = null; } traite(client); } } // contient les threads du pool + objet de synchro // le nouveau client // drapeau pour la fin du programme

Solution : crer un pool de threads


! Les threads existent indpendamment des clients ! Les threads se voient assigner des clients au fur et mesure

Deux approches :
! Pool statique : le nombre de threads du pool ne change jamais ! Pool dynamique : le nombre de threads du pool sadapte dynamiquement au nombre de clients (tout en restant limit)

public void server() { while(cont) { Client client = attendClient(); synchronized(pool) { prochainClients.push(client); pool.notify(); } } }

09/02/2009

Master SAR - M1 SRCS - Java

43

09/02/2009

Master SAR - M1 SRCS - Java

44

3.e. tude de deux patterns

3.e. tude de deux patterns


OutputStream os = new ; // le flux de sortie LinkedList<Object> pendings = new LinkedList<Object>(); // une liste chane boolean cont = true; // indique la fin du programme public void run() { Object next = null; while(cont) { synchronized(pendings) { while(pendings.size() == 0) pendings.wait(); next = pendings.removeFirst(); } os.writeObject(next); } } public void asyncWrite(Object o) { synchronized(pendings) { pendings.addLast(o); pendings.notify(); } }

Problme : fonction dcriture lente


Comment viter de rester bloquer sur une criture

Solution : utiliser un thread pour lcriture

09/02/2009

Master SAR - M1 SRCS - Java

45

09/02/2009

Master SAR - M1 SRCS - Java

46

Java pour la programmation client/serveur

4.a. Introduction et rappels sur les sockets


Socket = interface de programmation (API) avec les services du systme dexploitation pour exploiter les services de communication du systme (local ou rseau) Une socket est un demi-point de connexion dune application
(! communication par message/MOM)

4. Programmation rseau
a. b. c. d. Introduction et rappels sur les sockets Sockets en mode flux Sockets en mode datagram Sockets en mode multicast

Application A Socket

send() receive()

message

Application B Socket

# Une socket est caractrise par une adresse # Plusieurs domaines de sockets existent :
! Socket Unix (local) = un chemin dans le systme de fichier ! Socket Inet (rseau TCP, UDP ou IP) = adresse IP + port

09/02/2009

Master SAR - M1 SRCS - Java

47

09/02/2009

Master SAR - M1 SRCS - Java

48

4.a. Introduction et rappels sur les sockets


Couche 7 Couche 6 Couche 5 Couche 4 Couche 3 Couche 2 Couche 1 Applicative Prsentation Session Transport Rseau Liaison Physique Logiciels Reprsentation indpendante des donnes tablit et maintient des sessions Liaison entre applications de bout en bout, fragmentation, ventuellement vrification Adressage et routage entre machines Encodage pour lenvoi, dtection derreurs, synchronisation Le support de transmission lui-mme NFS XDR RPC TCP, UDP, Multicast IP

4.a. Introduction et rappels sur les sockets


Mode connect : la communication entre un client et un serveur est prcde dune connexion et suivi dune fermeture
! ! ! ! Facilite la gestion dtat Meilleurs contrle des arrives/dparts de clients Uniquement communication unicast Plus lent au dmarrage

Mode non connect : les messages sont envoys librement


Ethernet

! Plus facile mettre en uvre ! Plus rapide au dmarrage

# Sockets en Java : uniquement oriente transport (couche 4) # Deux API pour les sockets
! java.net : API bloquante (tudi ici) ! java.nio.channels (> 1.4) : API non bloquante (non tudie dans ce cours)
09/02/2009 Master SAR - M1 SRCS - Java 49

$ Il ne faut pas confondre connexion au niveau transport et au niveau applicatif!


! HTTP est un protocole non connect alors que TCP lai ! FTP est un protocole connect et TCP aussi ! RPC est un protocole non connect et UDP non plus
09/02/2009 Master SAR - M1 SRCS - Java 50

4.a. Introduction et rappels sur les sockets


Liaison par flux : Socket/ServerSocket (TCP)
! Connect : protocole de prise de connexion (lent) ! communication uniquement point point ! Sans perte : un message arrive au moins un fois ! Sans duplication : un message arrive au plus une fois ! Avec fragmentation : les messages sont coups ! Ordre respect " Communication de type tlphone

4.a. Introduction et rappels sur les sockets


Une socket est identifie par
! Une adresse IP : une des adresses de la machine (ou toutes) ! Un port : attribu automatiquement ou choisi par le programme

Adresse de Socket = Adresse IP + port Une socket communique avec une autre socket via son adresse

Liaison par datagram : DatagramSocket/DatagramPacket (UDP)


! ! ! ! Non connect : pas de protocole de connexion (plus rapide) Avec perte : lmetteur nest pas assur de la dlivrance Avec duplication : un message peut arriver plus dune fois Sans fragmentation : les messages envoys ne sont jamais coups ! soit un message arrive entirement, soit il narrive pas ! Ordre non respect " Communication de type courrier
09/02/2009 Master SAR - M1 SRCS - Java 51

! Flux : une socket se connecte une autre socket via son adresse de socket ! Datagram : une socket envoie/reoit des donnes /dune autre socket identifie par son adresse de socket

09/02/2009

Master SAR - M1 SRCS - Java

52

4.a. Introduction et rappels sur les sockets


Adressage
! Une adresse IP : identifie une carte rseau dune machine (par exp : 195.83.118.1) ! une machine peut possder plusieurs adresses (penser aux routeurs) ! Un port : identifie lapplication (par exp 21/ftpd) $ Seul ladministrateur peut ouvrir des ports < 1024

4.a. Introduction et rappels sur les sockets


java.net.InetAddress : objet reprsentant une adresse IP
static InetAddress InetAddress.getByAddress(byte ip[]) static InetAddress InetAddress.getByName(String name) static InetAddress InetAddress.getLocalHost() String InetAddress.getHostName() byte[] InetAddress.getHostAddr() construit un objet dadresse ip renvoie lAdresse IP de name renvoie notre adresse renvoie le nom symbolique renvoie ladresse IP

Nom symbolique (Domain Name Server)


! Associe une adresse IP un nom symbolique (par exp ftp.lip6.fr => 195.83.118.1) ! Une adresse peut tre associe plusieurs noms (par exp nephtys.lip6.fr ! ftp.lip6.fr ! 195.83.118.1) public class Main { public static void main(String args[]) { byte ip[] = {195, 83, 118, 1 }; InetAddress addr0 = InetAddress.getByAddress(ip); InetAddress addr1 = InetAddress.getByName("ftp.lip6.fr"); } }
53 09/02/2009 Master SAR - M1 SRCS - Java 54

Classes dadresses : A (1-126), B (128-191), C (192-223), D/Multicast (224-239), Locale (127)


09/02/2009 Master SAR - M1 SRCS - Java

4.a. Introduction et rappels sur les sockets


java.net.SocketAddress : objet reprsentant une adresse de Socket sans protocole attach java.net.InetSocketAddress : objet reprsentant une adresse IP + port
InetSocketAddress(InetAddress addr, int port); InetSocketAddress(String name, int port); InetAddress InetSocketAddress.getAddress() int InetSocketAddress.getPort(); String InetSocketAddress.getHostName(); Construit une adresse de Socket Construit une adresse de Socket Renvoie ladresse IP Renvoie le port Renvoie le nom symbolique de lIP

4.a. Introduction et rappels sur les sockets


Problme : plusieurs clients colocaliss doivent se connecter un serveur unique
! Temps douverture/fermeture de connexion long ! Tous les clients ne sont pas forcement connects chaque instant ! Apparition/disparition de clients

Client 2

Client 1

Client 3

Solution : mutualiser les connexions


! Pool de connexions ouvertes en permanence ! Les clients (r)utilisent les connexions ouvertes

Pool de connexion

public class Main { public static void main(String args[]) { byte ip[] = {195, 83, 118, 1 }; InetAddress addr = InetAddress.getByAddress(ip); InetSocketAddress saddr0 = new InetSocketAddress(addr, 21); InetSocketAddress saddr1 = new InetSocketAddress("ftp.lip6.fr", 21); }}

Exemple : pool de connexions un SGBD ! Politique de gestion de ressources partages


Problmes classiques de rservation de ressources, dinterblocages SGBD

09/02/2009

Master SAR - M1 SRCS - Java

55

09/02/2009

Master SAR - M1 SRCS - Java

Client 4
56

4.a. Introduction et rappels sur les sockets


Client Protocole A ! Passage de firewalls ! Optimisation du nombre de connexions Client Protocole B

4.a. Introduction et rappels sur les sockets


Reprsentation donnes
! Pas le mme codage entre serveur et client big endian (powerpc) versus little indian (pentium) ! Pas la mme faon de stocker les donnes processeur 32 bits (pentium) versus processeur 64 bits (xeon)

Problme :

Solution : Multiplexer une connexion


! Plusieurs protocoles transitent par la mme socket

Dispatcher Client

! Distinguer les flux de donnes


! Encadrer les protocoles par des mta-donnes ! Acheminer le message vers la bonne application

Deux solutions pour communiquer


! Prvoir toutes les conversions possibles (n^2 convertisseurs) ! Utiliser un format pivot (2n convertisseurs)
Dispatcher Server Server Protocole A Server Protocole B

Peut tre coupl avec un pool de connexions

Nombreux formats pivots :


Sun XDR, srialisation Java, Corba CDR

09/02/2009

Master SAR - M1 SRCS - Java

57

09/02/2009

Master SAR - M1 SRCS - Java

58

4.b. Sockets en mode flux


Socket en mode flux de Java
! Repose sur TCP ! Indpendant de TCP

4.b. Sockets en mode flux


Ncessite une phase de connexion
! Serveur : attend des connexion ! une socket de connexion (ServerSocket) ! Client : se connecte au serveur (Socket)

Proprits
! Taille des messages quelconques ! Envoi en gnral bufferis (i.e. un envoi OS correspond plusieurs critures Java) ! Pas de perte de messages, pas de duplication ! Les messages arrivent dans lordre dmission ! Contrle de flux (i.e. bloque lmetteur si le rcepteur est trop lent) ! Pas de reprise sur panne Trop de perte ou rseau satur ! connexion perdue

Le serveur doit maintenir des connexions avec plusieurs clients


! Une socket de communication par client (Socket)
Seul le port de cette socket doit tre connu 1 connect() 2 accept() Serveur 3 send/receive Socket

Client 1

ServerSocket

Nombreuses utilisations : HTTP, FTP, Telnet, SMTP, POP


09/02/2009 Master SAR - M1 SRCS - Java 59 09/02/2009

send/receive

Client 2

Master SAR - M1 SRCS - Java

60

4.b. Sockets en mode flux


Serveur sa = new ServerSocket(#port) Client sc = new Socket(); InetAddress server = InetAddres.getByName(#nom); sc.connect( new InetSockAddress(server, #port)); InputStream is = sc.getInputStream() OutputStream os = sc.getOutputStream()

4.b. Sockets en mode flux


Remarques
! La socket du serveur possde le port #port qui identifie le serveur ! La socket de communication du serveur possde un port attribue automatiquement par Java lors de laccept() ! La socket de communication du client possde un port attribue automatiquement par Java lors du connect() ! Il est possible de fixer le ports de la socket du client par sc.bind(new SocketAddress(InetAddress.getLocalHost(), #port)); ! Il est possible de fixer le port de la socket de connexion du serveur aprs sa cration par ServerSocket sa = new ServerSocket(); sa.bind(new SocketAddress(InetAddress.getLocalHost(), #port));

sc = sa.accept();

connexion

InputStream is = sc.getInputStream() OutputStream os = sc.getOutputStream()

is.read(); os.write() flux sc.close(); sc.close(); is.read(); os.write();

09/02/2009

Master SAR - M1 SRCS - Java

61

09/02/2009

Master SAR - M1 SRCS - Java

62

4.b. Sockets en mode flux


Retrouver les adresses IP et les ports
Port du serveur $*>?-2@+'2!3 Client $*>?-2.+*#0@+'2!3 Port du client Adresse du serveur $*>?-2A,,'-$$!3 Client $*>?-2.+*#0A,,'-$$!3 Adresse du client Port du client $*>?-2@+'2!3 Server $*>?-2.+*#0@+'2!3 Port du serveur Adresse du client $*>?-2A,,'-$$!3 Server $*>?-2.+*#0A,,'-$$!3 Adresse du serveur

4.b. Sockets en mode flux


Remarque : les flux associs aux sockets peuvent tre encapsuls dans nimporte quels autres flux
ObjectInputStream is = new ObjectInputStream( new GZipInputStream(sc.getInputStream())); ObjectOutputStream os = new ObjectOutputStream( new GZipOutputStream(sc.getOuputStream())); mission : os.writeObject("Hello, World!!!"); Rception : System.out.println(is.readObject());

09/02/2009

Master SAR - M1 SRCS - Java

63

09/02/2009

Master SAR - M1 SRCS - Java

64

4.b. Sockets en mode flux


Problme : dfinir des sockets personnalises
(Passer des firewalls, utiliser un autre protocole que TCP)

4.c. Sockets en mode datagram


Socket en mode datagram de Java
! Repose sur UDP ! Indpendant de UDP

Solution : Personnalisation des sockets


Socket
Dlgue les appels

Proprits
! ! ! ! ! ! ! Taille des messages fixe et limite (64ko) envoi non bufferis Possibilit de perte de messages, Duplication Les messages narrivent pas forcement dans lordre dmission Aucun contrle de flux Pas de dtection de panne (mme pas assur que les messages arrivent) Faible latence (car aucun contrle de flux, pas de connexion)

SocketImpl

! Principe : une Socket dlgue ses mthodes un objet SocketImpl


(accept(), connect(), getInputStream(), getOutputStream())

! Personnaliser les Sockets !

! Toute nouvelle Socket cre utilisera notre SocketImpl


09/02/2009 Master SAR - M1 SRCS - Java

" Dfinir une sous-classe de SocketImpl " Dfinir une classe qui implante SocketImplFactory interface SocketImplFactory { SocketImpl createSocketImpl(); } " Associer notre SocketImplFactory la factory par dfaut avec static void setSocketFactory(SocketImplFactory fac);

Nombreuses utilisations :
! DNS, TFTP, RIP ! Base pour la construction de IP Multicast
65 09/02/2009 Master SAR - M1 SRCS - Java 66

4.c. Sockets en mode datagram


DatagramSocket : Socket oriente Datagram
! Lie un port
" Assignation explicite new DatagramSocket(#port) ou socket.bind(SocketAddress saddr); " Assignation automatique lors de la premire entre/sortie

4.c. Sockets en mode datagram


Serveur sc = new DatagramSocket(#port); byte msg[] = new byte[256]; DatagramPacket in = new DatagramPacket(msg, 256); sc.receive(in); System.out.println(new String(msg)); msg = "Bien recu".getBytes(); sc.send( new DatagramPacket(msg, 0, msg.length, in.getSocketAddress())); msg = new byte[256]; DatagramPacket in = new DatagramPacket(msg, 256); sc.receive(in); System.out.println(new String(msg));
68

Client sc = new DatagramSocket(); InetAddress server = InetAddres.getByName(#nom); byte msg[] = "Hello, World!!!".getBytes(); sc.send( new DatagramPacket(msg, 0 msg.length, server, #port);

! Communique uniquement via des DatagramPacket (pas de flux!)

DatagramPacket : reprsente un message


! En rception : DatagramPacket(byte buf[], int offset, int length); ! En mission : DatagramPacket(byte buf[], int offset, int length, InetSocketAddress saddr);

$Attention : si la taille du buffer de rception est trop petite, la fin du message est perdu!
09/02/2009 Master SAR - M1 SRCS - Java 67

09/02/2009

Master SAR - M1 SRCS - Java

4.c. Sockets en mode datagram


Remarques sur les ports
! Le client a besoin de connatre ladresse IP et le port du serveur ! La socket du client se voit assigner un port lors de lenvoi

4.c. Sockets en mode datagram


DatagramPacket serialize(Object o) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bos); os.writeObject(o); Object receive(DatagramSocket s) { byte msg[] = bos.toByteArray(); byte buf[] = new byte[????]; return new DatagramPacket(msg, msg.length); DatagramPacket packet = } new DatagramPacket(buf, Object deserialize(DatagramPacket packet) { ObjectInputStream is = new ObjectInputStream( new ByteArrayInputStream(packet.getData(), packet.getOffset(), packet.getLength()); return is.readObject(); } buf.length); s.receive(packet); return deserialize(packet); } Comment prvoir la taille des messages?

Remarques sur la srialisation


! Une DatagramSocket ne possde pas de flux (car ce nest pas un flux!!!) ! Envoi uniquement de tableaux de bytes ! Rception uniquement de tableaux de bytes

La srialisation est tout de mme possible en utilisant


! ByteArrayInputStream : flux dentre qui lit partir dun tableau de bytes ! ByteArrayOutputStream : flux de sortie qui crit dans un tableau de bytes $Les messages restent limits en taille et le rcepteur doit prvoir priori un tampon suffisamment grand

09/02/2009

Master SAR - M1 SRCS - Java

69

09/02/2009

Master SAR - M1 SRCS - Java

70

4.c. Sockets en mode datagram


Problme : dfinir des sockets personnalises
(Passer des firewalls, utiliser un autre protocole que UDP, crypter les communication)

4.d. Sockets en mode multicast


Multicast = diffusion de groupe
! Rcepteur : sabonne une adresse IP de classe D
Adresse IP comprise entre 224.0.0.0 et 239.255.255.255 Certaines adresses sont dj rserves
(voir http://www.iana.org/assignments/multicast-addresses)

Solution : Personnalisation des sockets


Mme principe quavec les sockets en mode flux ! Dfinir une nouvelle implantation de DatagramSocket via DatagramSocketImpl ! Dfinir une nouvelle usine DatagramSocket via DatagramSocketImplFactory ! Enregistrer lusine via DatagramSocket.setDatagramSocketImplFactory()

! metteurs : mettent destination de cette adresse IP


rcepteur metteur rcepteur

Adresse Multicast 232.16.1.7


metteur rcepteur
Master SAR - M1 SRCS - Java

rcepteur

09/02/2009

Master SAR - M1 SRCS - Java

71

09/02/2009

72

4.d. Sockets en mode multicast


Socket en mode multicast de Java
! Repose sur IP Multicast, lui-mme bas sur UDP ! Indpendant de UDP

4.d. Sockets en mode multicast


Groupe multicast = ensemble de rcepteurs sur une adresse multicast metteur :
! met sur une adresse de classe D + port ! Pas dabonnement ncessaire ! mission tout instant

Proprits : mme proprits quUDP


! ! ! ! Taille des messages fixe et limite (64ko) envoi non bufferis Possibilit de perte de messages ou de duplication pour certains rcepteurs Les messages narrivent pas forcement dans lordre dmission, pas forcement dans le mme ordre chez tous les rcepteurs ! Aucun contrle de flux

Rcepteur :
! Sabonne une adresse de classe D (! abonnement de la machine) MulticastSocket.joinGroup(InetAddress group); ! coute sur un port donne (! abonnement de lapplication) ! Se dsabonne de la classe D avant de quitter MulticasrSocket.leaveGroup(InetAddress group); ! Peut rejoindre et quitter le groupe multicast tout instant
09/02/2009 Master SAR - M1 SRCS - Java 74

Encore peu dutilisations :


! Universit ! Certaines webradio, certains fournisseurs daccs pour de la diffusion vido ! La plupart des routeurs jettent les packets multicast!

09/02/2009

Master SAR - M1 SRCS - Java

73

4.d. Sockets en mode multicast


Rcepteur byte msg[] = new byte[256]; DatagramPacket in = new DatagramPacket(msg, 256); sc = new MulticastSocket(#port); InetAddress group = InetAddress.getByName( "230.0.0.1"); sc.joinGroup(group); abonne metteur sc = new DatagramSocket(); // ou new MulticastSocket // si il est aussi rcepteur InetAddress group = InetAddress.getByName( "230.0.0.1"); byte msg[] = "Hello, World!!!".getBytes(); sc.send( new DatagramPacket(msg, 0 msg.length, group, #port);

4.d. Sockets en mode multicast


Limiter la porte des messages multicast
En fixant le TTL (setTimeToLive(int)) " 0 : ne dpasse pas la machine " 1 : ne dpasse pas le rseau local " 127 : monde entier

Autres protocoles de diffusion bass sur le Multicast


! Jgroups, LRMP, JavaGroups ! Fournissent dautres proprits comme " Fragmentation/dfragmentation des messages (> 64ko) " Ordre garantie des messages " Notification darrive et de dpart de membres "

sc.receive(in); System.out.println(new String(msg));

09/02/2009

Master SAR - M1 SRCS - Java

75

09/02/2009

Master SAR - M1 SRCS - Java

76

S-ar putea să vă placă și