Communication inter-processus : une introduction (Programation en java)
Rushed Kanawati
LIPN, CNRS UMR 7030 Universit´e Paris 13 http://lipn.fr/∼kanawati [email protected]
January 31, 2017
Plan
1 Introduction
2 Classes Java pour la programmation r´eseaux: TCP/IP La classe InetAddress
Classes pour communication UDP Serveur UDP multi-threads Communication Multicast Communication TCP
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 2 / 38
Introduction
Objectifs
Communication inter-processus par tube
Programmation de clients/serveurs : UDP et TCP
Programmation de clients/Serveur r´ eseaux multi-threads
Introduction
Communication inter-processus
Les tubes
:
communication unidirectionnelle
entr´ee processus p`eere/fils ou processus fr`eres.
Les sockets
communication bidirectionnelle gestion similaire aux sockets interUnix.
Communiquer = ´ecrire dans un fichier
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 4 / 38
Introduction
Communication par tube en Java
// c r ´e e r une s o r t i e p u i s une e n t r ´e e // r e l i ´e e `a c e t t e s o r t i e ou l ’ i n v e r s e ! P i p e d W r i t e r t u b o u t = new P i p e d W r i t e r ();
P i p e d R e a d e r t u b i n = new P i p e d R e a d e r ( t u b o u t );
Introduction
Ecriture dans un tube
// D a n s t h r e a d p r o d u c t e u r ( ´e c r i t m e s s a g e m ) S t r i n g m = " b o n j o u r ";
// C o n v e r s i o n de m : S t r i n g en buf : c h a r []
buf = new c h a r[ m . l e n g t h ( ) ] ; m . g e t C h a r s (0 , m . l e n g t h () , buf , 0 ) ; // e c r i t d a n s le t u b e
out . w r i t e ( cbuf ,0 , mes . l e n g t h ( ) ) ;
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 6 / 38
Introduction
Lecture d’un tube
c h a r c b u f []= new c h a r[ 2 0 ] ; int c h a r L u =0;
do{ try{
c h a r L u = in . r e a d ( cbuf ,0 ,20);
// le c o n s o m m a t e u r se s u i c i d e au b e s o i n ! if ( c h a r L u == 1){
S y s t e m . out . p r i n t l n (" fin ");
S y s t e m . e x i t ( 0 ) ; }
S t r i n g s = new S t r i n g ( cbuf ,0 , c h a r L u );
Introduction
Rappel : Architecture Logicielle TCP/IP
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 8 / 38
Introduction
Communication TCP/TP : Caract´ erisation
Adresses IP
source et destination Num´ ero de
portssource et destination.
Protocole
de transport utilis´ e : UDP ou TCP
Introduction
Num´ ero de Port
Un port d´ esigne le SAP (Service Access Point) de la couche application.
L’adresse d’une application sur le r´ eseau est donc d´ efinie par le couple :
@IP d la machine : num´ero de port.L’IANA
1r´ epartit les num´ eros de ports en trois cat´ egories :
Les ports syst`emes: 0 - 1023. Sous Linux l’utilisation de ces ports n´ecessite d’avoir les privil`eges d’administrateur.Les ports d´epos´es : 1024 - 49151 sont disponibles pour les utilisateurs et peuvent eux aussi ˆetre d´epos´es aupr`es de l’ IANA
Les ports priv´es: 49152 `a 65535.
1Internet Assigned Numbers Authority, http://www.iana.org
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 10 / 38
Introduction
Le concept de socket
Un
socketest une
interfaceentre une application et un service de la couche de transport.
Plusieurs
typesde socket : socket UDP et socket TCP.
Il est repr´ esent´ e comme un fichier : l’´ ecriture dans ce fichier
corresponds ` a l’envoie d’un message selon le protocole associ´ e (UDP ou TCP). La r´ eception d’un message se fait par une op´ eration de lecture.
Un socket est associ´ e alors ` a un protocole de transport et ` a un
num´ ero de port.
Classes Java pour la programmation r´eseaux: TCP/IP
TCP/IP : Programmation en Java
Le paquetage
java.netoffre les classes de base :
InetAddress: pour la manipulation d’adresses IP.
DatagramSocket: pour la manipulation de sockets UDP.
DatagramPacket: pour la manipulation de paquets UDP.
ServerSocket: pour la manipulation de socket de serveurs TCP Socket: pour la manipulation de socket TCP d’´echange de donn´ees.
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 12 / 38
Classes Java pour la programmation r´eseaux: TCP/IP La classe InetAddress
La classe InetAddress
Cette classe n’offre pas de constructeurs. La cr´
eation d’un objet passe par l’appel d’une des m´ ethodes statiques suivantes :
static InetAddress getLocalHost() throws UnknownHostException
Retourne un objet InetAddress repr´esentant la machine locale public static InetAddress getByName(String host) throws UnknownHostException
Retourne un objet InetAddress qui corresponds ) la r´esolution par le syst`eme DNS de nomhost.
public static InetAddress[] getAllByName(String host) throws UnknownHostException
Retourne toutes les adresses retrouv´ees de host.
Classes Java pour la programmation r´eseaux: TCP/IP La classe InetAddress
La classe InetAddress : Exemples
I n e t A d d r e s s a , b , c ; ...
try {
a = I n e t A d d r e s s . g e t L o c a l H o s t ();
b = I n e t A d d r e s s . g e t B y N a m e (" i u t v . univ - p a r i s 1 3 . fr ");
c = I n e t A d d r e s s . g e t B y N a m e (" 1 2 7 . 0 . 0 . 1 ");
} c a t c h ( U n k n o w n H o s t E x c e p t i o n e ) { ... }
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 14 / 38
Classes Java pour la programmation r´eseaux: TCP/IP La classe InetAddress
La classe InetAddress : m´ ethodes de services
public String getHostName()
Retourne le nom complet correspondant ` a l’adresse IP public String getHostAddress()
Retourne l’adresse IP sous forme num´ erique.
public byte[] getAddress()
Retourne l’adresse IP sous forme d’une suite d’octets.
Classes Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
Rappel : Protocole UDP
UDP op` ere en mode
non connect´e: ´ echange de datagramms (paquets)
L’entˆ ete d’un paquet UDP contient les num´ eros de ports source et destination.
Les adresses IP sont dans l’entˆ ete IP encapsul´ e dans le paquet.
Un paquet UDP contient donc : Les adresses IP source et destination, les ports source et destination et le message ` a envoyer (suite d’octets)
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 16 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
La classe DatagramPacket
Classe de manipulation de paquets UDP.
Constructeur pour encapsuler un paquet UDP ` a recevoir :
DatagramPacket(byte[] buf, int length)o` u
bufest le message ` a recevoir et
lengthla taille du message.
Constructeur pour encapsuler un paquet UDP ` a envoyer :
DatagramPacket(byte[] buf, int length, InetAddress address, int port)o` u
bufest le message ` a envoyer,
lengthla taille du message,
addressest l’adresse IP destination et
portest le port destination.
Attention
le message
bufdoit ˆ etre initialis´ e avant la construction du
paquet.
Classes Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
La classe DatagramPacket : m´ ethodes de services
InetAddress getAddress()
Retourne l’adresse IP de la machine distante.
int getPort()
Retourne le num´ ero de port distant.
byte[] getData()
Retourne la partie donn´ ee du paquet.
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 18 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
Classe DatagramSocket
Constructeurs :
public DatagramSocket() throws SocketException Cr´ eation d’un socket UDP associ´ e ` a un port libre (priv´ e)
public DatagramSocket(int port) throws SocketException
Cr´ eation d’un socket UDP associ´ e au port
portClasses Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
DatagramSocket : M´ ethodes de service
public void send(DatagramPacket p) throws IOException Envoyer le paquet p
public void receive(DatagramPacket p) throws IOException
recevoir un paquet p.
L’appel ce cette m´ethode est bloquante.public void setSoTimeout(int timeout) throws SocketException
Permet de d´ ebloquer le thread ex´ ecutant une m´ ethode recieve au bout de timeout seconds.
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 20 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
Exemple : Envoie de message UDP (1)
/* I n i t i a l i s a t i o n d ’ un s o c k e t UDP */
D a t a g r a m S o c k e t s o c k e t = new D a t g r a m S o c k e t ()
/* i d e n t i f i c a t i o n de l ’ a p p l i c a t i o n d e s t i n a t i o n : @IP ; p o r t */
I n e t A d d r e s s a d d r e s s =
I n e t A d d r e s s . g e t B y N a m e (" i u t v . univ - p a r i s 1 3 . fr ");
int p o r t = 8 8 8 8 ;
/* Le m e s s a g e `a e n v o y e r */
S t r i n g s = new S t r i n g (" B o n j o u r P a r i s 13 ");
b y t e[] m e s s a g e = new b y t e[ 1 0 2 4 ] ;
/* t r a n s f o r m a t i o n du m e s s a g e en s u i t e d ’ o c t e t s */
Classes Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
Exemple : Envoie de message UDP (2)
/* F o r m a t i o n du p a q u e t UDP `a e n v o y e r */
D a t a g r a m P a c k e t p a q u e t =
new D a t a g r a m P a c k e t ( message , l o n g u e u r , address , p o r t );
/* e n v o i du p a q u e t */
s o c k e t . s e n d ( p a q u e t );
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 22 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Classes pour communication UDP
Exemple : R´ eception de message UDP (1)
try {
D a t a g r a m S o c k e t s o c k e t = new D a t a g r a m S o c k e t ( 8 8 8 8 ) ; b y t e[] b u f f e r = new b y t e[ 1 0 2 4 ] ;
// On a s s o c i e un p a q u e t `a un b u f f e r v i d e p o u r la r ´e c e p t i o n D a t a g r a m P a c k e t p a q u e t =new
D a t a g r a m P a c k e t ( buffer , b u f f e r . l e n g t h );
/* a t t e n t e de r ´e c e p t i o n */
s o c k e t . r e c e i v e ( p a q u e t );
/* a f f i c h a g e du p a q u e t r e ¸c u */
S t r i n g s = new S t r i n g ( b u f f e r );
S y s t e m . out . p r i n t l n (" m e s s a g e r e ¸c u : " + s );
Classes Java pour la programmation r´eseaux: TCP/IP Serveur UDP multi-threads
Serveur UDP multi-threads
Pourquoi ?
R´ eduire le temps d’attente de traitement de requˆ etes en permettant le traitement parall` ele.
Comment ?
Pour chaque paquet UDP re¸ cu par le serveur, un
threadde traitement se charge du traitement du paquet.
Optimisation :
Un serveur peut anticiper la cr´ eation de threads de traitement afin de r´ eduire le temps d’attente de traitement d’une requˆ ete.
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 24 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Serveur UDP multi-threads
Serveur UDP multi-threads : Exemple
D a t a g r a m S o c k e t s o c k e t = new D a t a g r a m S o c k e t ( 8 8 8 8 ) ; w h i l e(t r u e) {
b y t e[] b u f f e r = new b y t e[ 1 0 2 4 ] ; D a t a g r a m P a c k e t p a q u e t =
n e w D a t a g r a m P a c k e t ( buffer , b u f f e r . l e n g t h );
s o c k e t . r e c e i v e ( p a q u e t );
/* L a n c e m e n t d ’ un t h r e a d de t r a i t e m e n t
`
a la r ´e c e p t i o n d ’ un p a q u e t */
new H a n d l e r ( p a q u e t ). s t a r t ();
Classes Java pour la programmation r´eseaux: TCP/IP Serveur UDP multi-threads
Serveur UDP multi-threads : Exemple
c l a s s H a n d l e r e x t e n d s T h r e a d { p r i v a t e D a t a g r a m P a c k e t p ;
p u b l i c H a n d l e r ( D a t a g r a m P a c k e t p ) t h r o w s E x c e p t i o n { if ( p != n u l l} {
t h i s. p = p ; } e l s e {
t h r o w new E x c e p t i o n ();
}
p u b l i c v o i d run () {
/* t r a i t e m e n t du p a q u e t */
}
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 26 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Communication Multicast
Communication Multicast
Communication Multicast : Diffusion restreinte de messages au sein d’un groupe.
Un groupe multicarte est identifi´ e par une adresse IP de classe
D.Plage d’adresses de classe D (IPv4) : 224.0.0.1 - 239.255.255.255.
224.0.0.0 - 224.0.0.255 : adresses r´eserv´ees pour des services syst`emes.
224.0.0 - 238.255.255.255 : adresses publiques 239.0.0.0 - 239.255.255.255: adresses priv´ees.
Utilisation d’un socket sp´ ecial :
MulticastSocketClasses Java pour la programmation r´eseaux: TCP/IP Communication Multicast
La classe MulticastSocket
Sous-classe de
DatagramSocketConstructeurs :
p u b l i c M u l t i c a s t S o c k e t () t h r o w s I O E x c e p t i o n /* C r ´e a t i o n d ’ un s o c k e t m u l t i c a s t a s s o c i ´e
`
a un p o r t UDP l i b r e */
p u b l i c M u l t i c a s t S o c k e t (int p o r t ) t h r o w s I O E x c e p t i o n /* C r ´e a t i o n d ’ un s o c k e t m u l t i c a s t a s s o c i ´e
au p o r t UDP p o r t */
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 28 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Communication Multicast
La classe MulticastSocket
Quelques m´ ethodes de services :
p u b l i c v o i d j o i n G r o u p ( I n e t A d d r e s s m c a s t a d d r ) t h r o w s I O E x c e p t i o n
/* r e j o i n d r e un g r o u p e de m u l t i c a s t */
p u b l i c v o i d l e a v e G r o u p ( I n e t A d d r e s s m c a s t a d d r ) t h r o w s I O E x c e p t i o n
/* Q u i t t e r un g r o u p e de m u l t i c a s t */
p u b l i c v o i d s e t T i m e T o L i v e (int ttl ) t h r o w s I O E x c e p t i o n /* F i x e r le TTL a s s o c i ´e aux p a q u e t s UDP */
p u b l i c int g e t T i m e T o L i v e ()
Classes Java pour la programmation r´eseaux: TCP/IP Communication Multicast
Multicast : exemple
p u b l i c c l a s s M u l t i c a s t {
p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ){
M u l t i c a s t S o c k e t soc ; I n e t A d d r e s s adr ; D a t a g r a m P a c k e t p ; b y t e[] msg ;
try{
adr = I n e t A d d r e s s . g e t B y N a m e (" 2 2 8 . 5 . 6 . 7 ");
soc = new M u l t i c a s t S o c k e t ();
soc . j o i n G r o u p ( adr );
msg = new S t r i n g (" S a l u t !! "). g e t B y t e s ();
p = new D a t a g r a m P a c k e t ( msg , msg . length , adr , 8 8 8 8 ) ; soc . s e n d ( p );
}c a t c h( E x c e p t i o n ex ){}
}
} R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 30 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Communication Multicast
Multicast : exemple
p u b l i c c l a s s M C C l i e n t {
p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ){
M u l t i c a s t S o c k e t soc ; I n e t A d d r e s s adr ; D a t a g r a m P a c k e t p ; b y t e[] msg ;
try{
adr = I n e t A d d r e s s . g e t B y N a m e (" 2 2 8 . 5 . 6 . 7 ");
soc = new M u l t i c a s t S o c k e t ( 8 8 8 8 ) ; soc . j o i n G r o u p ( adr );
msg = new b y t e[ 1 0 2 4 ] ;
p = new D a t a g r a m P a c k e t ( msg , msg . l e n g t h );
soc . r e c e i v e ( p );
S y s t e m . out . p r i n t l n (" M e s s a g e r e ¸c u "+
new S t r i n g ( p . g e t D a t a ( ) ) ) ;
Classes Java pour la programmation r´eseaux: TCP/IP Communication TCP
Communication TCP
Communication en
mode connect´eCommunication en trois phases : connexion, ´echange, d´econnexion.
Contrˆole d’erreurs et de perte de messages : m´ecanismes d’acquittements.
La phase de connexion est
asym´etrique. On parle alors de serveur etde client.
Le serveur TCP utilise un socket de la classe
ServerSocket.L’´ echange de messages se fait ` a travers de sockets de la classe
SocketR. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 32 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Communication TCP
La classe ServerSocket
Rˆ ole : attendre la r´ eception de demande de connexion. Puis cr´ eation d’un socket d’´ echange sur acceptation.
Constructeur :
p u b l i c S e r v e r S o c k e t (int p o r t )
t h r o w s I O E x c e p t i o n ; /* C r ´e a t i o n d ’ un s o c k e t de c o n n e x i o n TCP a s s o c i ´e
au p o r t p o r t */
M´ etode d’acceptation de demande de connexion:
p u b l i c S o c k e t a c c e p t ()
t h r o w s I O E x c e p t i o n ; /* A t t e n t e de d e m a n d e de c o n n e x i o n ,
c r ´e a t i o n s ’ un s o c k e t d ’ ´e c h a n g e a p r `e s a c c e p t a t i o n */
Classes Java pour la programmation r´eseaux: TCP/IP Communication TCP
La classe Socket
Constructeur :
p u b l i c S o c k e t ( I n e t A d d r e s s server , int p o r t ) t h r o w s I O E x c e p t i o n ; /* D e m a n d e de c o n n e x i o n au s e r v e u r TCP
d o n t l ’ a d r e s s e est s e r v e r et qui est
`
a l ’ ´e c o u t e sur p o r t */
M´ ethode d’´ echange de donn´ ees :
p u b l i c I n p u t S t r e a m g e t I n p u t S t r e a m ();
/* r e n v o y e r un f l u s d ’ e n t r ´e e p o u r l i r e les m e s s a g e s */
p u b l i c O u t p u t S t r e a m g e t O u t p u t S t r e a m ();
/* r e n v o y e r un f l u s d ’ e n t r ´e e p o u r l ’ e n v o i de m e s s a g e s */
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 34 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Communication TCP
Serveur TCP : exemple
p u b l i c c l a s s E c h o S e r v e r {
p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { S e r v e r S o c k e t s e r S o c ;
D a t a I n p u t S t r e a m in ; P r i n t S t r e a m out ; S o c k e t soc ; try {
s e r S o c = new S e r v e r S o c k e t ( I n t e g e r . p a r s e I n t ( a r g s [ 0 ] ) ) ; w h i l e(t r u e) {
soc = s e r S o c . a c c e p t ();
in = new D a t a I n p u t S t r e a m ( soc . g e t I n p u t S t r e a m ( ) ) ;
Classes Java pour la programmation r´eseaux: TCP/IP Communication TCP
Serveur TCP : exemple
w h i l e (t r u e) {
S t r i n g l i g n e = in . r e a d L i n e ();
out . p r i n t l n (" E C H O : "+ l i g n e );
} }
} c a t c h ( E x c e p t i o n e ) { } } }
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 36 / 38
Classes Java pour la programmation r´eseaux: TCP/IP Communication TCP
Client TCP : exemple
p u b l i c c l a s s E c h o C l i e n t {
p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { S o c k e t soc ;
D a t a I n p u t S t r e a m in ;
D a t a I n p u t S t r e a m u s e r I n p u t ; P r i n t S t r e a m out ;
S t r i n g l i g n e ; try {
soc = new S o c k e t ( a r g s [0] , I n t e g e r . p a r s e I n t ( a r g s [ 1 ] ) ) ; in = new D a t a I n p u t S t r e a m ( soc . g e t I n p u t S t r e a m ( ) ) ;
out = new P r i n t S t r e a m ( soc . g e t O u t p u t S t r e a m ( ) ) ;
Classes Java pour la programmation r´eseaux: TCP/IP Communication TCP
Client TCP : exemple
w h i l e (t r u e) {
l i g n e = u s e r I n p u t . r e a d L i n e ();
if ( l i g n e . e q u a l s (" . ")) b r e a k;
out . p r i n t l n ( l i n g o );
S y s t e m . out . p r i n t l n ( in . r e a d L i n e ( ) ) ; }
}
c a t c h ( U n k n o w n H o s t E x c e p t i o n e ) { } c a t c h ( I O E x c e p t i o n e ) { } } }
R. Kanawati (LIPN) Syst`emes d’exploitation January 31, 2017 38 / 38