Communication inter-processus : une introduction (Programation en java) Rushed Kanawati LIPN, CNRS UMR 7030 Université Paris 13 http://lipn.fr/∼kanawati [email protected] 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 in = out { = new Socket ( args [0] , Integer . parseInt ( args [1])); new DataInputStream ( soc . getInputStream ()); = 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