Communication entre processus From Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edition 3, © Addison-Wesley 2001 Chapitre 4 Plan Caractéristiques des protocoles de communication entre processus dans un système réparti Principes généraux communication par datagrammes • • Client-serveur Communication de groupe par flots (streams) • Client-serveur construction de protocoles pour les patterns de communication client-serveur : requête-réponse groupe : même message est envoyé à plusieurs processus données représentation des objets dans les messages références à des objets distants Des objets aux bits Comment les objets et les structures de données doivent-ils être traduits pour ensuite être transmis dans les messages sur le réseau ? Sérialisation XML Représentation externe des données information dans les programmes structures de données et objets information dans les messages suite d ’octets tous les ordinateurs ne représentent pas les valeurs primitives de la même manière Comment les ordinateurs peuvent-ils s ’échanger des données ? Echange de données Protocole 1 les valeurs sont converties en un format externe convenu avant la transmission à la réception, conversion du format commun dans le format de la machine pour supporter RMI ou RPC, il faut un format commun (appelé représentation externe des données) Protocole 2 les valeurs sont transmises dans le format de l ’émetteur avec une indication du format utilisé le destinataire convertit les valeurs si nécessaire Marshalling et unmarshalling Marshalling Traduction des structures de données et des valeurs primitives en une représentation externe de données Unmarshalling génération de valeurs primitives à partir de leur représentation externe reconstruction des structures de données Usages transmission dans des messages entreposage dans des fichiers Activités réalisées au niveau du middleware Approches Alternatives Corba common data representation (CDR) utilisable dans plusieurs langages Sérialisation pour usage en Java seulement Représentations alternatives transformation des données primitives en forme binaire (e.g. Corba CDR et sérialisation) transformation des objets en texte (e.g. protocole http) Sérialisation en Java Le processus qui effectue la désérialisation ne possède pas de connaissance a priori sur les classes des objets à désérialiser besoin d ’information sur la classe des objets à désérialiser nom de la classe numéro de version • fixé par le programmeur • calculé automatiquement charger cette classe sur la machine destination Sérialisation Lorsqu ’un objet est sérialisé, tous les objets qu ’il référence sont sérialisés Handles : référence à un objet dans la forme sérialisée Désérialisation s ’assurer qu ’un objet n ’est écrit qu ’une fois s ’assurer que les références pointent bien vers leur « handle » Algorithme Encoder le nom de la classe et son numéro de version Encoder le nombre, les types et noms des variables d ’instance si les variables d ’instance appartiennent à de nouvelles classes, réitérer le processus jusqu ’à ce que tous les types et descriptions des variables d ’instance aient été encodés Ecrire les valeurs les types primitifs sont transcrits dans un format binaire portable à l ’aide des méthodes de java.io.ObjectOutputStream les chaînes et les caractères sont transcrits via la méthode writeUTF de java.io.ObjectOutputStream UTF = Universal Transfer Format La sérialisation en Java est un procédé générique qui utilise la réflexivité pour trouver le nom de la classe de l ’objet, etc. pas besoin de créer des fonctions spéciales de marshallisation comme en Corba Rendre les classes sérialisables La classe doit implémenter java.io.Serializable La sérialisation est réalisée par la méthode defaultWriteObject de la classe ObjectOutputStream classe de l ’objet signature valeurs de toutes les variables non-transient et non-static La désérialisation est réalisée par la méthode defaultReadObject de la classe ObjectInputStream Ajuster la sérialisation private void writeObject(ObjectOutputStream s) throws IOException { s.defaultWriteObject(); // customized serialization code } private void readObject(ObjectInputStream s) throws IOException { s.defaultReadObject(); // customized deserialization code ... // followed by code to update the object, if necessary } gère seulement la sérialisation immédiate de la classe la sérialisation des superclasses est gérée automatiquement Contrôle explicite de la sérialisation package java.io; public interface Externalizable extends Serializable { public void writeExternal(ObjectOutput out) throws IOException; public void readExternal(ObjectInput in) throws IOException, java.lang.ClassNotFoundException; } L ’externalisation des superclasses n ’est pas appelée automatiquement Sérialisation : exemple //serializing the object to a file named theTime FileOutputStream out = new FileOutputStream("theTime"); ObjectOutputStream s = new ObjectOutputStream(out); s.writeObject("Today"); //throws a NotSerializableException if it's given an object that is not serializable s.writeObject(new Date()); s.flush(); Désérialisation : exemple FileInputStream in = new FileInputStream("theTime"); ObjectInputStream s = new ObjectInputStream(in); String today = (String)s.readObject(); Date date = (Date)s.readObject(); Exemple Explanation Serialized values Person 8-byte version number h0 class name, version number 3 int year java.lang.String java.lang.String number, type and name of name: place: instance variables 1934 5 Smith 6 London h1 values of instance variables The true serialized form contains additional type markers; h0 and h1 are handles Référence à un objet remote Identificateur pour un objet remote valide pour tout le système réparti invocation de méthode paramètre résultat de l ’invocation d ’une méthode tout objet remote ne possède qu ’une seule référence unique à travers le temps et l ’espace les références remote peuvent être comparées entre elles pour déterminer si elles réfèrent au même objet remote Représentation d ’une référence remote 32 bits 32 bits Internet address port number 32 bits time 32 bits object number interface of remote object Adresse vs référence Durée de vie des objets remote RMI simple aussi longtemps que le processus qui les a créés existe la référence remote peut être utilisée comme adresse de l ’objet remote relocalisation des objets dans un processus différent sur un autre ordinateur la référence remote ne peut pas être utilisée comme adresse de l ’objet remote • voir Chapitre 17.2.4