programmation réseaux illustration : sockets en java
DESCRIPTION
Programmation Réseaux Illustration : Sockets en Java. Anne-Marie Déry [email protected]. À travailler seuls. Concepts généraux. Mise en œuvre Java. Année 2011-2012. Communication par diffusion : Multicast. Client1. Serveur. Gr. Client2. Clientn. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/1.jpg)
Programmation RéseauxIllustration : Sockets en Java
Anne-Marie Dé[email protected]
À travailler seuls
Concepts généraux
Mise en œuvre Java
Année 2011-2012
![Page 2: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/2.jpg)
Communication par diffusion : Multicast
Clientn
ServeurClient1
Client2Gr
![Page 3: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/3.jpg)
Ouvrir un socket = demander à se Connecter
Les clients demandent seulement à joindre un groupe
![Page 4: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/4.jpg)
Exemple de multicast
Un serveur de citation qui envoie une citation toutes les minutes à tous les clients qui écoutent (multicast)
![Page 5: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/5.jpg)
Créer un paquet de sortiePréparer et Envoyer une donnée
Scénario d’un serveur
Fermer le socket d’entrée
Créer le socket d’entrée
![Page 6: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/6.jpg)
Scénario d’un client
Création d’un paquet d’entréeAttente de données en entréeRéception et traitement des données en entrée
Fermer le socket d ’entrée
Créer le socket d’entrée
![Page 7: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/7.jpg)
Classe MulticastSocket
Des constructeurs : par défaut, port à utiliser
Des accesseurs en lecture : adresse du groupe (getInterface…)
Des méthodes : pour envoyer un paquet datagramme, pour joindre ou quitter un groupe (send, joinGroup, leaveGroup)
![Page 8: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/8.jpg)
Multicast: MulticastSocket
Type de socket utilisé côté client pour écouter des paquets quele serveur « broadcast » à plusieurs clients. .
Une extension du QuoteServer : broadcaste à intervalle régulier à tous ses clients
![Page 9: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/9.jpg)
Cœur du serveurwhile (moreQuotes) { try { byte[] buf new byte[256]; // don't wait for request...just send a quote
String dString = null; if (in == null) dString = new Date().toString(); else dString = getNextQuote(); buf = dString.getBytes(); InetAddress group = InetAddress.getByName("230.0.0.1"); DatagramPacket packet; packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet);
try {sleep((long)Math.random() * FIVE_SECONDS); } catch (InterruptedException e) { } } catch (IOException e) { e.printStackTrace(); moreQuotes = false;} } socket.close();}
![Page 10: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/10.jpg)
Différences principales
Le DatagramPacket est construit à partir de de « l’adresse de plusieurs clients »
L ’adresse et le no de port sont câblés
no de port 4446 (tout client doit avoir un MulticastSocket lié à ce no). L’adresse InetAddress "230.0.0.1" correspond à un identificateur de groupe et non à une adresse Internet de la machine d’un client
Le DatagramPacket est destiné à tous les clients qui écoutent le port 4446 et qui sont membres du groupe "230.0.0.1".
![Page 11: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/11.jpg)
Un nouveau Client
Pour écouter le port 4446, le programme du client doit créer son MulticastSocket avec ce no. Pour être membre du groupe "230.0.0.1" le client adresse la méthode joinGroup du MulticastSocket avec l’adresse d’identification du groupe.
Le serveur utilise un DatagramSocket pour faire du broadcast à partirde données du client sur un MulticastSocket. Il aurait pu utiliser aussiun MulticastSocket. Le socket utilisé par le serveur pour envoyer leDatagramPacket n’est pas important. Ce qui est important pour lebroadcast est d’adresser l’information contenue dans le DatagramPacket, et le socket utilisé par le client pour l’écouter.
![Page 12: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/12.jpg)
MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName("230.0.0.1"); socket.joinGroup(group);
DatagramPacket packet; for (int i = 0; i < 5; i++) { byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); socket.receive(packet);
String received = new String(packet.getData()); System.out.println("Quote of the Moment: " + received); } socket.leaveGroup(group); socket.close();
![Page 13: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/13.jpg)
Synthèse
Client Serveur
TCP aSocket aServerSocketconnecté write read
read write
UDP aDatagramSocket aDatagramSocketnon connecté send receive
receive send
Multicast aMulticastSocket aDatagramSocket/aMulticastSocket
receive send
I/O Stream I/O Stream
aDatagramPacket
aDatagramPacket
![Page 14: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/14.jpg)
Définir un nouveau type de socket
Pourquoi ?Préparer les données avant de les envoyerReconstruire les données reçues
ExempleJava RMI Sockets spécialisées (marshalling et unmarshalling)
Exemple Images : Compression et Décompression
Comment ?En spécialisant les classes de base
![Page 15: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/15.jpg)
Comment Définir un nouveau type de Sockets
La classe CompressionSocket et ses classes relatives4 étapes
Communication TCP Définir des E/S Spécifiques
1. Etendre java.io.FilterOutputStream pour créer un output stream pour ce type de Socket. Surcharge de méthodes si nécessaire.Le write doit compresser l’image avant d’écrire 2. Etendre java.io.FilterInputStream Le read doit décompresser après avoir lu
![Page 16: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/16.jpg)
Comment Définir un nouveau type de Sockets
La classe CompressionSocket et ses classes relatives4 étapes
3. Etendre java.net.Socket Implémenter les constructeurs appropriés et surchargergetInputStream, getOutputStream et close.
4. Etendre java.net.ServerSocket Implémenter le constructeur et surcharger acceptpour créer un socket du bon type.
![Page 17: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/17.jpg)
Un « nouveau » Package : java.nio
Cette API définit : Buffers : qui explicitent la notion de buffers – containers
de données› Améliorent les problèmes de bufferisation liés aux E/S
Charsets : qui associent des « décodeurs » et des « encodeurs » qui gèrent correctement les conversions chaines – octets› Éliminent les problème d’accent (caractères Unicode / UTF),
![Page 18: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/18.jpg)
Un « nouveau » Package : java.nio
Channels : qui représentent des connexions entre entités avec de meilleures performances pour les opérations de lecture et d’écriture
Selectors et selection keys : associées aux
selectable channels définissent des E/S multiplexées non bloquantes › évitent les threads
![Page 19: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/19.jpg)
Le package Channel
SelectableChannel : canal qui peut être multiplexé
DatagramChannel Un canal dédié aux communicationsUDP prises en charge par des sockets de type java.net.DatagramSocket
ServerSocketChannel : Un canal dédié aux connexions TCP prises en charge par des sockets de type java.net.ServerSocket
SocketChannel : Un canal dédié aux communications TCP prises en charge par des sockets de type java.net.Socket
![Page 20: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/20.jpg)
Conclusion
Une large bibliothèque pour traiter les sockets et différents types de communication entre Clients et Serveurs dans Java
Une extension naturelle par abstraction à l’appel de méthodes à distance - Java RMI
et une normalisation Corba avec l’intégration d’un ORB
….
![Page 21: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/21.jpg)
Java et la réflexivité
![Page 22: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/22.jpg)
Java reflection is useful because it supports dynamic retrievalof information about classes and data structures by name, and allows for their manipulation within an executing Java program. This feature is extremely powerful and has no equivalent in other conventional languages such as C, C++, Fortran, or Pascal.
Glen McCluskey
has focused on programming languages since 1988.He consults in the areas of Java and C++ performance, testing, and technical documentation.
![Page 23: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/23.jpg)
Réflexivité en Java ?
La réflexivité en Java permet à un programme Java de s’examiner en cours d’exécution de manipuler ses propriétés internes.
Par exemple, une classe Java peut obtenir le nom de tous ses membres.Utilisation connue de la réflexivité :
l’édition sous EclipseL’outil utilise la réflexivité pour obtenir liste des méthodes publiques qui peuvent être envoyées à une instance d’une classe
![Page 24: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/24.jpg)
Que peut on faire ?Obtenir des informations sur les classes
Simuler l’opérateur instanceofDécouvrir la liste et le descriptif des méthodes Obtenir des informations sur les constructeursAvoir des informations sur les variables
Invoquer des méthodes, des constructeurs, affecter des variablesCréer des objets et des tableaux dynamiquement lors de l ’exécution du programme sans connaître à la compilation
le nom et les arguments d’une méthode / constructeurle nom de la variablele type des objets, des tableaux….
![Page 25: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/25.jpg)
Réflexivité = un package Java
java.lang.reflect.*
des classes: Object
AccessibleObject
Constructor
Field
Method Array
InvocationTargetException
Modifier
ReflectPermission
une interface : Member
![Page 26: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/26.jpg)
Oui mais comment ?Comment travailler avec les classes du package reflect ?
Obtenir un objet java.lang.Class
Récupérer des informations sur la classe
Utiliser l’API de reflect
Illustration à partir de l’exemple
![Page 27: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/27.jpg)
Un exemple simplepublic class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0]); Method m[] = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i]); } catch (Throwable e) {System.err.println(e);} } }
public java.lang.Object java.util.Stack.push(java.lang.Object)public synchronized java.lang.Object java.util.Stack.pop()public synchronized java.lang.Object java.util.Stack.peek()public boolean java.util.Stack.empty()public synchronized int java.util.Stack.search(java.lang.Object)
java.util.Stack
![Page 28: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/28.jpg)
Classe Class
Instances de Class : classes et interfaces d’une application Java. Tous les tableaux sont aussi instances de Class (type des éléments, dimension). Les types primitifs (boolean, byte, char, short, int, long, float, double) et le mot clé void sont aussi des objets Class.
Cette classe n’a pas de constructeur public. Les instances sont créées automatiquement par la VM lorsque les classessont chargées et par la méthode defineClass des class loader.
![Page 29: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/29.jpg)
Obtenir un objet java.lang.Class
représentant de la classe que l’on veut manipuler : Pour les types de base Class c = int.class; ou Class c = Integer.TYPE;
TYPE est une variable prédéfinie du wrapper (Integer, par exemple) du type fondamental.
Pour les autres classes
Class c = Class.forName("java.lang.String");
![Page 30: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/30.jpg)
Récupérer des informations sur la classe
Appeler une méthode sur l’objet classe récupéré :
getDeclaredMethods : obtenir la liste de toutes les méthodes déclarées dans la classe
getConstructors : obtenir la liste des constructeurs dans la classe
getDeclaredFields : obtenir la liste des variables déclarées dans la classe (variables non héritées)
getFields : obtenir la liste des variables publiques accessibles....
![Page 31: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/31.jpg)
Utiliser l’API de reflect
Par exemple :
Class c = Class.forName("java.lang.String"); Method m[] = c.getDeclaredMethods(); System.out.println(m[0]));
pour manipuler l’information
![Page 32: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/32.jpg)
Comment Simuler l’opérateur instanceOf
Class cls = Class.forName(args[0]); boolean b1 = cls.isInstance(args[1]); System.out.println(b1);
Instances de la classe passée en paramètres ?
![Page 33: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/33.jpg)
classe AccessibleObject et interface Member
AccessibleObject : Classe de base de Field, Method et Constructor. Permet de supprimer ou de valider la vérification faite par défautconcernant les contrôles d’accès. Ces vérifications (sur private, public, package..) sont effectuéeslorsqu’on affecte ou lit des champs, lorsqu’on invoque une méthodeet lorsqu’on crée une instance.
Member : interface qui réifie les informations communes à un membre(champ ou méthode) ou à un constructeur.
![Page 34: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/34.jpg)
Classes Method, Field et Constructor
Method fournit les informations et les accès à une méthode(de classe, d’instance ou abstraite) d’une classe ou d’une interface.
Field fournit les informations et accès dynamiques aux champs (static ou d’instances) d’une classe ou d’une interface. Constructor fournit des informations et des accès à unconstructeur d’une classe.
![Page 35: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/35.jpg)
Les méthodes d’une classe ?
1. récupérer l ’objet Class que l’on souhaite observer,
2. récupérer la liste des objets Method par getDeclaredMethods :méthodes définies dans cette classe (public, protected, package, etprivate) getMethods permet d’obtenir aussi les informations concernant les méthodes héritées
3. A partir des objets méthodes, il est facile de récupérer : les types de paramètres, les types d’exception, et le type de l’argument retourné sous la forme d’un type fondamental ou d’un objet classe.
![Page 36: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/36.jpg)
Exemple de programme Class cls = Class.forName(args[0]); Method methlist[] = cls.getDeclaredMethods(); for (int i = 0; i < methlist.length; i++) { Method m = methlist[i]; System.out.println("name = " + m.getName()); System.out.println("decl class = " + m.getDeclaringClass()); Class pvec[] = m.getParameterTypes(); for (int j = 0; j < pvec.length; j++) System.out.println("param #" + j + " " + pvec[j]); Class evec[] = m.getExceptionTypes(); for (int j = 0; j < evec.length; j++) System.out.println("exc #" + j + " " + evec[j]); System.out.println("return type = " + m.getReturnType());}
![Page 37: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/37.jpg)
Exemple d’exécution
name = f1decl class = class method1param #0 class java.lang.Objectparam #1 intexc #0 class java.lang.NullPointerExceptionreturn type = intname = maindecl class = class method1param #0 class java.lang.Stringreturn type = void
public class method1 { private int f1(Object p, int x) throws NullPointerException {……..} public static void main(String args[]) {….}
![Page 38: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/38.jpg)
Invocation des méthodes par leur nom
Equivalent du apply de Scheme
pour invoquer une méthode m dont le nom est spécifié à l’exécution(dans le cadre de l’environnement de développement des JavaBeans par exemple)1. Trouver une méthode dans une classe getMethod à partirdes types de ses paramètres et de son nom. 2. La stocker dans un objet Method3. Construire la liste des paramètres d’appel 4. Faire l’appel
Si on manipule un type fondamental à l’appel ou au retour l’encapsuler dans la classe correspondante (int , Integer)
![Page 39: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/39.jpg)
Exemple de programmeClass cls = Class.forName(args[0]);Class partypes[] = new Class[2];partypes[0] = Integer.TYPE;partypes[1] = Integer.TYPE;Method meth = cls.getMethod("add",partypes);method2 methobj = new method2();Object arglist[] = new Object[2];arglist[0] = new Integer(37);arglist[1] = new Integer(47);Object retobj = meth.invoke(methobj, arglist); Integer retval = (Integer)retobj;System.out.println(retval.intValue())
![Page 40: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/40.jpg)
Exemple d’exécutionpublic class method2 { public int add(int a, int b) { return a + b; } public static void main(String args[]) {…… ……
}
?
![Page 41: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/41.jpg)
Découverte des variablesSimilaire à la découverte de méthodes et de constructeurs.
l’utilisation de la classe Modifier. Modifier représente les modifiers des variables (private int ...). Ils sont eux mêmes représentés par un integer, Modifier.toString renvoie la chaine correspondant à l’ordre « officiel » ("static" avant "final").
On peut obtenir les informations sur les variables définies dansles super classes par getFields.
![Page 42: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/42.jpg)
Informations sur les constructeurs
Les constructeurs sont similaires aux méthodes
mais ne renvoient pas de résultat
![Page 43: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/43.jpg)
Création de nouveaux objets
Invoquer un constructeur implique de créer un nouvel objet(allouer de la mémoire et construire l’objet)
1. Trouver un constructeur qui accepte les types spécifiés 2. L’invoquer
Création purement dynamique avec recherche (lookup) du constructeuret invocation à l’exécution et non à la compilation.
![Page 44: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/44.jpg)
Utilisation des tableaux
Création et manipulation des tableaux. Array = un type spécial de classe Le type du tableau qui est créé est dynamique et n’a pas besoind’être connu à la compilation
![Page 45: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/45.jpg)
Réflexivité = un package Java
java.lang.reflect.*
des classes: Object
AccessibleObject
Constructor
Field
Method Array
InvocationTargetException
Modifier
ReflectPermission
une interface : Member
![Page 46: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/46.jpg)
Comment avoir un code indépendant du protocole d’applications ?
![Page 47: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/47.jpg)
En RMI ?Le protocole est écrit dans une interface Java
Des stubs sont générés et contiennent le code sockets Ils sont écrits grâce à la réflexivité Java
Que font les stubs ?
1. Trouver la liste des méthodes de l’interface2. Du côté client
1. Sérialiser et envoyer sur le réseau2. Attendre le résultat sérialisé et le restructurer
3. Dou côté du serveur1. Déserialiser ce qui est reçu et invoquer la méthode avec les
paramètres2. Récupérer le résultat, le sérialiser et l’envoyer au client
![Page 48: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/48.jpg)
Un peu plus de réflexivité
Les ClassLoader ????
![Page 49: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/49.jpg)
Classe ClassLoaderClassLoader est une classe abstraite. Un class loader est un objet responsable du chargement des classes
Un nom de classe donné, il peut localiser ou générer les données quiconstituent une définition de la classe. Chaque objet Class a une référence à un ClassLoader qui le définit.
Applications implémentent des sous classes de ClassLoader afind’étendre la façon de dynamiquement charger des classes par la VM.(utilisation de manager de sécurité, par exemple)
![Page 50: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/50.jpg)
ClassLoader ?
En UNIX la VM charge les classes à partir des chemins définis dans CLASSPATH.
Certaines classes peuvent être obtenues à partir d’autres sources, telles que le réseau ou construites par une application. La méthode defineClass convertit un tableau d’octets en une instance de Class.Instances pouvant être créées grâce à newInstance
Les méthodes et constructeurs créés par un class loader peuvent référencer d’autres classes (loadClass du class loader de cette classe).
![Page 51: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/51.jpg)
Utilité et utilisation en programmation socket ?
![Page 52: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/52.jpg)
Pour ne plus déployer les classes du serveur chez le client
Utilisation des chargeurs de classes qui téléchargent des classes depuis une URL
Utilisation d ’un serveur Web qui fournit les classes Ce que ça change
Bien entendu, les classes et interfaces du serveur ne changent pas
Le code du serveur ne change pas
le client et la façon de le démarrer sont modifiés Il faut lancer un serveur Web
Chargement dynamique
![Page 53: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/53.jpg)
Chargement dynamique des classes
Problème de sécurité Le programme client télécharge du code sur
le réseau Ce code pourrait contenir des virus ou
effectuer des opérations non attendues !!! Utilisation d ’un gestionnaire de sécurité
pour les applications clientes Possibilité de créer des gestionnaires de
sécurité personnalisés pour des applications spécifiques
![Page 54: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/54.jpg)
Chargement dynamique des classes en RMI
Problème de sécurité Utilisation d ’un gestionnaire de sécurité
pour les applications clientes RMI RMI fournit des gestionnaires de sécurité
suffisants pour un usage classique
![Page 55: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/55.jpg)
Séparation des classes› Serveur (fichiers nécessaires a l'exécution du
serveur) HelloWorldServer.class HelloWorldImpl.class HelloWorld.class HelloWorldImpl_Stub.class
› Download (fichiers de classes à charger dans le programme client) HelloWorldImpl_Stub.class
› Client (fichiers nécessaires au démarrage du client) HelloWorld.class HelloWorldClient.class
Hello World : chargement dynamique en RMI
![Page 56: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/56.jpg)
chargement statique en socket ?
chargement dynamique en socket ?
Application Surnoms
![Page 57: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/57.jpg)
Le client doit connaître l'emplacement des classes afin de pouvoir les télécharger
On peut le lui préciser lors du lancement
> java -Djava.security.policy=client.policy -Dcodebase=http://www.class-server.com:80/ HelloWorldClient
Les classes à télécharger doivent être placées dans le répertoire des documents Web du serveur Web, accessibles via une URL
› le chargeur de classes ira chercher les classes à un emplacement de type
› http://www.class-server.com/classes/ClasseATelechharger.class
Comment procéder ?
![Page 58: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/58.jpg)
Mettre les classes Download dans le répertoire des documents Web du serveur Web, accessibles via une URL
› le chargeur de classes ira chercher les classes à un emplacement de type http://www.class-server.com/classes/HelloWorldImpl_Stub.class
Hello World en RMI : Démarrage du serveur Web
![Page 59: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/59.jpg)
› Le programme Java client doit pouvoir se connecter aux ports de la base de registres RMI et des implémentations des objets de serveur, ainsi qu'au port du serveur Web
› Fichier client.policygrant {
permission java.net.SocketPermission"*:1024-65535", "connect,resolve";
permission java.net.SocketPermission"*:80", "connect";
};
Hello World : Politiques de sécurité
![Page 60: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/60.jpg)
Le client intègre un gestionnaire de sécurité RMI pour les stubs téléchargés dynamiquementimport java.rmi.*;import java.rmi.server.*;
public class HelloWorldClient {
public static void main(String[] args) {try {
// Installe un gestionnaire de sécurité RMISystem.setSecurityManager(new RMISecurityManager());System.out.println("Recherche de l'objet serveur...");HelloWorld hello = (HelloWorld)Naming.lookup("rmi://server/HelloWorld");System.out.println("Invocation de la méthode sayHello...");String result = hello.sayHello();System.out.println("Affichage du résultat :");System.out.println(result);
} catch(Exception e) {e.printStackTrace();
}}
}
Hello World : gestionnaire de sécurité RMI
![Page 61: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/61.jpg)
› 1) Lancer la base de registres RMI (elle doit pouvoir accéder aux classes Download - CLASSPATH)> rmiregistry
› 2) Lancer le serveur Web servant les fichiers de classes Download
› 3) Lancer le serveur (les classes Server doivent être accessibles)> java HelloWorldServer
Création de l'objet serveur...Référencement dans le RMIRegistry...Attente d'invocations - CTRL-C pour stopper
Hello World : Démarrage coté serveur
![Page 62: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/62.jpg)
› Le client doit pouvoir se connecter à des machines distantes pour la base de registres RMI, les objets de serveur ainsi que le serveur Web On doit lui fournir un fichier client.policy
› Le client doit bien connaître l'emplacement des classes afin de pouvoir les télécharger On va le lui préciser lors du lancement
> java -Djava.security.policy=client.policy -Djava.rmi.server.codebase=http://www.class-server.com:80/ HelloWorldClient
Hello World : Démarrage coté client
![Page 63: Programmation Réseaux Illustration : Sockets en Java](https://reader035.vdocuments.pub/reader035/viewer/2022062501/56816498550346895dd66dbb/html5/thumbnails/63.jpg)
Exemple de redéfinition du chargement de classe
Un class loader qui permet de charger des fichiers de classes via le réseau
ClassLoader loader=new NetworkClassLoader(host,port);Object main= loader.loadClass("Main", true).newInstance();….
NetworkClassLoader doit définir findClass et loadClassData pour charger et defineClass pour créer une instance de Class.