Вы находитесь на странице: 1из 38

Communication inter-processus : une introduction

(Programation en java)

Rushed Kanawati

LIPN, CNRS UMR 7030


Université Paris 13
http://lipn.fr/∼kanawati
rushed.kanawati@lipn.univ-paris13.fr

January 31, 2017

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 1 / 38


Plan

1 Introduction

2 Classes Java pour la programmation réseaux: TCP/IP


La classe InetAddress
Classes pour communication UDP
Serveur UDP multi-threads
Communication Multicast
Communication TCP

R. Kanawati (LIPN) Systèmes 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éseaux multi-threads

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 3 / 38


Introduction

Communication inter-processus

Les tubes :
communication unidirectionnelle
entrée processus pèere/fils ou processus frères.
Les sockets
communication bidirectionnelle
gestion similaire aux sockets interUnix.
Communiquer = écrire dans un fichier

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 4 / 38


Introduction

Communication par tube en Java

// créer une sortie puis une entrée


// reliée à cette sortie ou l ’ inverse !
PipedWriter tubout = new PipedWriter ();
PipedReader tubin = new PipedReader ( tubout );

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 5 / 38


Introduction

Ecriture dans un tube

// Dans thread producteur ( écrit message m )


String m = " bonjour " ;
// Conversion de m : String en buf : char []
buf = new char [ m . length ()];
m . getChars (0 , m . length () , buf ,0);
// ecrit dans le tube
out . write ( cbuf ,0 , mes . length ());

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 6 / 38


Introduction

Lecture d’un tube

char cbuf []= new char [20];


int charLu =0;
do {
try {
charLu = in . read ( cbuf ,0 ,20);
// le consommateur se suicide au besoin !
if ( charLu == 1){
System . out . println ( " fin " );
System . exit (0);
}
String s = new String ( cbuf ,0 , charLu );

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 7 / 38


Introduction

Rappel : Architecture Logicielle TCP/IP

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 8 / 38


Introduction

Communication TCP/TP : Caractérisation

Adresses IP source et destination


Numéro de ports source et destination.
Protocole de transport utilisé : UDP ou TCP

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 9 / 38


Introduction

Numéro de Port

Un port désigne le SAP (Service Access Point) de la couche


application.
L’adresse d’une application sur le réseau est donc définie par le couple
: @IP d la machine : numéro de port.
L’IANA1 répartit les numéros de ports en trois catégories :
Les ports systèmes : 0 - 1023. Sous Linux l’utilisation de ces ports
nécessite d’avoir les privilèges d’administrateur.
Les ports déposés : 1024 - 49151 sont disponibles pour les utilisateurs
et peuvent eux aussi être déposés auprès de l’ IANA
Les ports privés : 49152 à 65535.

1
Internet Assigned Numbers Authority, http://www.iana.org
R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 10 / 38
Introduction

Le concept de socket

Un socket est une interface entre une application et un service de la


couche de transport.
Plusieurs types de socket : socket UDP et socket TCP.
Il est représenté comme un fichier : l’écriture dans ce fichier
corresponds à l’envoie d’un message selon le protocole associé (UDP
ou TCP). La réception d’un message se fait par une opération de
lecture.
Un socket est associé alors à un protocole de transport et à un
numéro de port.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 11 / 38


Classes Java pour la programmation réseaux: TCP/IP

TCP/IP : Programmation en Java

Le paquetage java.net offre 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’échange de données.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 12 / 38


Classes Java pour la programmation réseaux: TCP/IP La classe InetAddress

La classe InetAddress

Cette classe n’offre pas de constructeurs. La création d’un objet passe


par l’appel d’une des méthodes statiques suivantes :
static InetAddress getLocalHost() throws
UnknownHostException
Retourne un objet InetAddress représentant la machine locale
public static InetAddress getByName(String host) throws
UnknownHostException
Retourne un objet InetAddress qui corresponds ) la résolution par le
système DNS de nom host.
public static InetAddress[] getAllByName(String host)
throws UnknownHostException
Retourne toutes les adresses retrouvées de host.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 13 / 38


Classes Java pour la programmation réseaux: TCP/IP La classe InetAddress

La classe InetAddress : Exemples

InetAddress a ,b , c ;
...
try {

a = InetAddress . getLocalHost ();


b = InetAddress . getByName ( " iutv . univ - paris13 . fr " );
c = InetAddress . getByName ( " 127.0.0.1 " );

} catch ( 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èmes d’exploitation January 31, 2017 14 / 38


Classes Java pour la programmation réseaux: TCP/IP La classe InetAddress

La classe InetAddress : méthodes de services

public String getHostName()


Retourne le nom complet correspondant à l’adresse IP
public String getHostAddress()
Retourne l’adresse IP sous forme numérique.
public byte[] getAddress()
Retourne l’adresse IP sous forme d’une suite d’octets.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 15 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

Rappel : Protocole UDP

UDP opère en mode non connecté : échange de datagramms


(paquets)
L’entête d’un paquet UDP contient les numéros de ports source et
destination.
Les adresses IP sont dans l’entête IP encapsulé dans le paquet.
Un paquet UDP contient donc : Les adresses IP source et destination,
les ports source et destination et le message à envoyer (suite d’octets)

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 16 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

La classe DatagramPacket

Classe de manipulation de paquets UDP.


Constructeur pour encapsuler un paquet UDP à recevoir :
DatagramPacket(byte[] buf, int length)
où buf est le message à recevoir et length la taille du message.
Constructeur pour encapsuler un paquet UDP à envoyer :
DatagramPacket(byte[] buf, int length, InetAddress
address, int port)
où buf est le message à envoyer, length la taille du message,
address est l’adresse IP destination et port est le port destination.
Attention le message buf doit être initialisé avant la construction du
paquet.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 17 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

La classe DatagramPacket : méthodes de services

InetAddress getAddress()
Retourne l’adresse IP de la machine distante.
int getPort()
Retourne le numéro de port distant.
byte[] getData()
Retourne la partie donnée du paquet.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 18 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

Classe DatagramSocket

Constructeurs :
public DatagramSocket() throws SocketException
Création d’un socket UDP associé à un port libre (privé)
public DatagramSocket(int port) throws SocketException
Création d’un socket UDP associé au port port

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 19 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

DatagramSocket : Méthodes 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éthode est bloquante.
public void setSoTimeout(int timeout) throws
SocketException
Permet de débloquer le thread exécutant une méthode recieve au
bout de timeout seconds.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 20 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

Exemple : Envoie de message UDP (1)

/* Initialisation d ’ un socket UDP */


DatagramSocket socket = new DatgramSocket ()

/* identification de l ’ application destination : @IP ; por


InetAddress address =
InetAddress . getByName ( " iutv . univ - paris13 . fr " );
int port = 8888;

/* Le message à envoyer */
String s = new String ( " Bonjour Paris 13 " );
byte [] message = new byte [1024];

/* transformation du message en suite d ’ octets */


message = s . getBytes ();

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 21 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

Exemple : Envoie de message UDP (2)

/* Formation du paquet UDP à envoyer */

DatagramPacket paquet =
new DatagramPacket ( message , longueur , address , port );

/* envoi du paquet */
socket . send ( paquet );

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 22 / 38


Classes Java pour la programmation réseaux: TCP/IP Classes pour communication UDP

Exemple : Réception de message UDP (1)

try {
DatagramSocket socket = new DatagramSocket (8888);
byte [] buffer = new byte [1024];
// On associe un paquet à un buffer vide pour la réception
DatagramPacket paquet = new
DatagramPacket ( buffer , buffer . length );

/* attente de réception */
socket . receive ( paquet );

/* affichage du paquet reçu */


String s = new String ( buffer );
System . out . println ( " message reçu : " + s );
} catch ( Exception e ) {}

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 23 / 38


Classes Java pour la programmation réseaux: TCP/IP Serveur UDP multi-threads

Serveur UDP multi-threads

Pourquoi ? Réduire le temps d’attente de traitement de requêtes en


permettant le traitement parallèle.
Comment ? Pour chaque paquet UDP reçu par le serveur, un thread
de traitement se charge du traitement du paquet.
Optimisation : Un serveur peut anticiper la création de threads de
traitement afin de réduire le temps d’attente de traitement d’une
requête.

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 24 / 38


Classes Java pour la programmation réseaux: TCP/IP Serveur UDP multi-threads

Serveur UDP multi-threads : Exemple

DatagramSocket socket = new DatagramSocket (8888);

while ( true ) {

byte [] buffer = new byte [1024];


DatagramPacket paquet =
newDatagr amPack et ( buffer , buffer . length );
socket . receive ( paquet );

/* Lancement d ’ un thread de traitement


à la réception d ’ un paquet */

new Handler ( paquet ). start ();

/* se mettre à nouveau à attendre d ’ autres requ^


e tes */
}
R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 25 / 38
Classes Java pour la programmation réseaux: TCP/IP Serveur UDP multi-threads

Serveur UDP multi-threads : Exemple

class Handler extends Thread {

private DatagramPacket p ;

public Handler ( DatagramPacket p ) throws Exception {


if ( p != null } {
this . p = p ;
} else {
throw new Exception ();
}

public void run () {


/* traitement du paquet */
}

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 26 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication Multicast

Communication Multicast

Communication Multicast : Diffusion restreinte de messages au sein


d’un groupe.
Un groupe multicarte est identifié 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éservées pour des services systèmes.
224.0.0 - 238.255.255.255 : adresses publiques
239.0.0.0 - 239.255.255.255 : adresses privées.
Utilisation d’un socket spécial : MulticastSocket

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 27 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication Multicast

La classe MulticastSocket

Sous-classe de DatagramSocket
Constructeurs :
public MulticastSocket () throws IOException
/* Création d ’ un socket multicast associé
à un port UDP libre */

public MulticastSocket ( int port ) throws IOException


/* Création d ’ un socket multicast associé
au port UDP port */

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 28 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication Multicast

La classe MulticastSocket

Quelques méthodes de services :


public void joinGroup ( InetAddress mcastaddr )
throws IOException
/* rejoindre un groupe de multicast */

public void leaveGroup ( InetAddress mcastaddr )


throws IOException
/* Quitter un groupe de multicast */

public void setTimeToLive ( int ttl )


throws IOException
/* Fixer le TTL associé aux paquets UDP */

public int getTimeToLive ()


throws IOException

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 29 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication Multicast

Multicast : exemple
public class Multicast {

public static void main ( String [] args ){


MulticastSocket soc ;
InetAddress adr ;
DatagramPacket p ;
byte [] msg ;

try {
adr = InetAddress . getByName ( " 228.5.6.7 " );
soc = new MulticastSocket ();
soc . joinGroup ( adr );
msg = new String ( " Salut !! " ). getBytes ();
p = new DatagramPacket ( msg , msg . length , ad
soc . send ( p );

} catch ( Exception ex ){}


}
R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 30 / 38
Classes Java pour la programmation réseaux: TCP/IP Communication Multicast

Multicast : exemple
public class MCClient {
public static void main ( String [] args ){
MulticastSocket soc ;
InetAddress adr ;
DatagramPacket p ;
byte [] msg ;
try {
adr = InetAddress . getByName ( " 228.5.6.7 " );
soc = new MulticastSocket (8888);
soc . joinGroup ( adr );
msg = new byte [1024];
p = new DatagramPacket ( msg , msg . length );
soc . receive ( p );
System . out . println ( " Message reçu " +
new String ( p . getDat
} catch ( Exception ex ){}
}}
R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 31 / 38
Classes Java pour la programmation réseaux: TCP/IP Communication TCP

Communication TCP

Communication en mode connecté


Communication en trois phases : connexion, échange, déconnexion.
Contrôle d’erreurs et de perte de messages : mécanismes
d’acquittements.
La phase de connexion est asymétrique. On parle alors de serveur et
de client.
Le serveur TCP utilise un socket de la classe ServerSocket.
L’échange de messages se fait à travers de sockets de la classe Socket

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 32 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication TCP

La classe ServerSocket

Rôle : attendre la réception de demande de connexion. Puis création


d’un socket d’échange sur acceptation.
Constructeur :
public ServerSocket ( int port )
throws IOException ;
/* Création d ’ un socket de connexion TCP associé
au port port */

Métode d’acceptation de demande de connexion:


public Socket accept ()
throws IOException ;
/* Attente de demande de connexion ,
création s ’ un socket d ’ échange après acceptation */

l’appel de la méthode accept() est bloquant

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 33 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication TCP

La classe Socket

Constructeur :
public Socket ( InetAddress server , int port )
throws IOException ;
/* Demande de connexion au serveur TCP
dont l ’ adresse est server et qui est
à l ’ écoute sur port */

Méthode d’échange de données :


public InputStream getInputStream ();
/* renvoyer un flus d ’ entrée pour lire les messages *

public OutputStream getOutputStream ();


/* renvoyer un flus d ’ entrée pour l ’ envoi de
messages */

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 34 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication TCP

Serveur TCP : exemple

public class EchoServer {

public static void main ( String [] args ) {


ServerSocket serSoc ;
DataInputStream in ;
PrintStream out ;
Socket soc ;

try {

serSoc = new ServerSocket ( Integer . parseInt ( args [0]));

while ( true ) {
soc = serSoc . accept ();
in = new DataInputStream ( soc . getInputStream ());
out = new PrintStream ( soc . getOutputStream ());

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 35 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication TCP

Serveur TCP : exemple

while ( true ) {
String ligne = in . readLine ();
out . println ( " ECHO : " + ligne );
}
}

} catch ( Exception e ) { }
} }

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 36 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication TCP

Client TCP : exemple

public class EchoClient {

public static void main ( String [] args ) {

Socket soc ;
DataInputStream in ;
DataInputStream userInput ;
PrintStream out ;
String ligne ;

try {
soc = new Socket ( args [0] , Integer . parseInt ( args [1]));
in = new DataInputStream ( soc . getInputStream ());
out = new PrintStream ( soc . getOutputStream ());

userInput = new DataInputStream ( System . in );

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 37 / 38


Classes Java pour la programmation réseaux: TCP/IP Communication TCP

Client TCP : exemple

while ( true ) {
ligne = userInput . readLine ();
if ( ligne . equals ( " . " ))
break ;
out . println ( lingo );
System . out . println ( in . readLine ());
}
}
catch ( Un k n o w n H o s t E x c e p t i o n e ) { }
catch ( IOException e ) { } } }

R. Kanawati (LIPN) Systèmes d’exploitation January 31, 2017 38 / 38

Вам также может понравиться