Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.

Slides:



Advertisements
Présentations similaires
Sérialisation des objets
Advertisements

Le mécanisme des exceptions
Cours réseaux Essi2 Anne-Marie Déry
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Programmation Réseaux Illustration : Les Sockets en Java
1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté
Programmation Réseaux Illustration : Les Sockets en Java
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Java et la réflexivité.
Communication par diffusion : Multicast
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
1 I. Bus logiciel ? Mireille Blay-Fornarino Daprès et Sacha Et (cf. références en bas.
Des sockets à RMI Programmation réseau versus programmation objet
Applications distribuées et parallèlisme La communication ne doit pas rester bloquée pour un client.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Programmation Réseaux Illustration : Les Sockets en Java
Communication par diffusion : Multicast Clientn Serveur Client1 Client2 Gr.
Les Sockets et Java Cours Harmonisation Anne-Marie Déry.
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
Des sockets à RMI. Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur.
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
(Classes prédéfinies – API Java)
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
Cours 6 : XML et les architectures N-tiers – Tier Applicatif

Servlet JAVA.
À travailler seuls Concepts généraux Mise en œuvre Java Année
Parallel Programming in C with MPI and OpenMP
Programmation orientée objet
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
COURS DE PROGRAMMATION ORIENTEE OBJET :
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
JDBC ou comment manipuler une base de données en Java ?
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Communication entre processus - TCP From Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edition 3, © Addison-Wesley 2001 Chapitre.
Langage Oriente Objet Cours 2.
À travailler seuls Concepts généraux Mise en œuvre Java Année
Programmation concurrente
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
COURS DE PROGRAMMATION ORIENTEE OBJET :
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
1212 Entrée et sortie de fichiers Objectifs À la fin de ce cours, vous serez capables de : • Lire à partir de la console • Écrire sur la console.
Développement d’application client/serveur
La notion de type revisitée en POO
Communication entre processus From Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edition 3, © Addison-Wesley 2001 Chapitre.
11/04/ L'héritage Cours 7 Cours 7.
Créer des packages.
Cours Les flux ou streams. Cours 162 Flux : objet possédant des méthodes capables de lire ou écrire des flots d’octets sur tout support (mémoire,
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Entrées / Sorties.
Les Réseaux Informatiques Clients & Serveurs Le protocole FTP Laurent JEANPIERRE DEUST AMMILoR.
Les sockets.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Schéma de conception Factory Method Exemple Sylvain Giroux.
 Formulaires HTML : traiter les entrées utilisateur
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
Ingénierie des réseaux - Chapitre 2 bis Les sockets en Java
Introduction à la programmation objet avec java
Programmation Réseaux Qu’avez-vous retenu ? Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Architecture Client/Serveur
L. Gurret – M. Herve – P. Mignon – J. Prarioz. Introduction  Dernière étape d’analyse  Cahier des charges, spécifications et conception orientée objet.
Client/Server Socket. Client/Serveur.
Transcription de la présentation:

Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java

Communication asynchrone par messages Communication par diffusion

Communication par message : Envoi de datagrammes application opération Client Serveur req1 rep1 reqn repn

Programmation Socket avec UDP UDP: pas de connexion entre le client et le serveur Pas de lien privilégié entre le client et le serveur Lemetteur attache ladresse IP et le port pour le retour. Le serveur doit extraire ladresse IP et le port de lexpéditeur à partir du datagramme reçu application viewpoint UDP fournit un transfert non fiable de groupes doctets (datagrammes) entre un client et le serveur UDP: les données transmises peuvent être reçues dans le désordre ou perdues

Client/server socket interaction: UDP close clientSocket Serveur read reply from clientSocket create socket, clientSocket = DatagramSocket() Create, address ( hostid, port=x, send datagram request using clientSocket create socket, port= x, for incoming request: serverSocket = DatagramSocket() read request from serverSocket write reply to serverSocket specifying client host address, port umber Client

Datagrammes UDP et Sockets 2 classes : DatagramPacket et DatagramSocket Datagramme = un message indépendant envoyé sur le réseau arrivée, temps darrivée et contenu non garantis packages dimplémentation de communication via UDP de datagrammes

Exemple Un serveur de citation qui écoute un socket type datagram et envoie une citation si le client le demande Un client qui fait simplement des requêtes au serveur ATTENTION Plusieurs firewalls et routeurs sont configurés pour interdire le passage de paquets UDP

Une Application Client Serveur Le serveur reçoit en continu des paquets mode datagramme sur un socket un paquet reçu = une demande de citation dun client le serveur envoie en réponse un paquet qui contient une ligne "quote of the moment" Lapplication cliente envoie simplement un paquet datagramme au serveur indiquant quil souhaite recevoir une citation et attend en réponse un paquet du serveur.

La classe QuoteServer socket = new DatagramSocket(4445); Création dun DatagramSocket sur le port 4445 qui permet au serveur de communiquer avec tous ses clients try { in = new BufferedReader(new FileReader("one-liners.txt")); } catch (FileNotFoundException e) System.err.println("Couldn't open quote file. " + "Serving time instead."); } Le constructeur ouvre aussi un BufferedReader sur un fichier qui contient une liste de citations ( une citation par ligne)

suite contient une boucle qui tant quil y a des citations dans le fichier attend larrivée d un DatagramPacket correspondant à une requête client sur un DatagramSocket. Byte[] buf = new byte[256]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); En réponse une citation est mise dans un DatagramPacket et envoyée sur le DatagramSocket au client demandeur. String dString = null; if (in == null) dString = new Date().toString(); else dString = getNextQuote(); buf = dString.getBytes(); InetAddress address = packet.getAddress(); int port = packet.getPort(); packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet);

Suite Adresse Internet + numéro de port (issus du DatagramPacket ) = identification du client pour que le serveur puisse lui répondre Larrivée du DatagramPacket implique une requête ->contenu du buffer inutile Le constructeur utilisé pour le DatagramPacket : un tableau doctets contenant le message et la taille du tableau + Ladresse Internet et un no de port. Lorsque le serveur a lu toutes les citations on ferme le socket de communication. socket.close();

La classe QuoteClient envoie une requête au QuoteServer, attend la réponse et affiche la réponse à lécran. Variables utilisées : int port; InetAddress address; DatagramSocket socket = null; DatagramPacket packet; byte[] sendBuf = new byte[256]; Le client a besoin pour s exécuter du nom de la machine sur laquelle tourne le serveur if (args.length != 1) { System.out.println("Usage: java QuoteClient "); return; }

La partie principale du main Création d un DatagramSocket DatagramSocket socket = new DatagramSocket(); Le constructeur lie le Socket à un port local libre Le programme envoie une requête au serveur byte[] buf = new byte[256]; InetAddress address = InetAddress.getByName(args[0]); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445); socket.send(packet); Ensuite le client récupère une réponse et laffiche

Classe DatagramSocket Des constructeurs : par défaut, + no port + Adresse Inet Des accesseurs en lecture : adresse à laquelle le socket est lié, est connecté, le no port auquel il est lié, connecté, taille du buffer reçu ou envoyé (getInetAddress, getLocalAddress, getPort, getLocalPort, getReceivedBufferSize, getSendBufferSize…) Des méthodes : pour se connecter à une adresse, pour se déconnecter, pour envoyer un paquet datagramme, pour un recevoir un paquet datagramme (connect, disconnect, send, receive)

Classe DatagramPacket Des constructeurs : buffer + longueur de buffer + adresse destination + port… Des accesseurs en lecture : adresse à laquelle le paquet est envoyé, le no port à laquelle le paquet est envoyé, la donnée transmise (getAddress, getPort, getData, getLength…)

Communication par diffusion : Multicast Clientn Serveur Client1 Client2 Gr

Ouvrir un socket = demander à se Connecter Les clients demandent seulement à joindre un groupe

Exemple de multicast Un serveur de citation qui envoie une citation toutes les minutes à tous les clients qui écoutent (multicast)

Créer un paquet de sortie Préparer et Envoyer une donnée Scénario dun serveur Fermer le socket dentrée Créer le socket dentrée

Scénario dun client Création dun paquet dentrée Attente de données en entrée Réception et traitement des données en entrée Fermer le socket d entrée Créer le socket dentrée

Classe MulticastServer 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)

Multicast: MulticastSocket Type de socket utilisé côté client pour écouter des paquets que le serveur « broadcast » à plusieurs clients.. Une extension du QuoteServer : broadcaste à intervalle régulier à tous ses clients

Cœur du serveur while (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(" "); 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();}

Différences principales Le DatagramPacket est construit à partir de de « ladresse 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). Ladresse InetAddress " " correspond à un identificateur de groupe et non à une adresse Internet de la machine dun client Le DatagramPacket est destiné à tous les clients qui écoutent le port 4446 et qui sont membres du groupe " ".

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 " " le client adresse la méthode joinGroup du MulticastSocket avec ladresse didentification du groupe. Le serveur utilise un DatagramSocket pour faire du broadcast à partir de données du client sur un MulticastSocket. Il aurait pu utiliser aussi un MulticastSocket. Le socket utilisé par le serveur pour envoyer le DatagramPacket nest pas important. Ce qui est important pour le broadcast est dadresser linformation contenue dans le DatagramPacket, et le socket utilisé par le client pour lécouter.

MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName(" "); 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();

Synthèse ClientServeur TCPaSocketaServerSocket connectéwriteread readwrite UDPaDatagramSocketaDatagramSocket non connecté sendreceive receivesend MulticastaMulticastSocketaDatagramSocket/ aMulticastSocket receivesend I/O Stream aDatagramPacket

Quelques Informations utiles sur la sérialisation Java

Sérialisation-Desérialisation Enregistrer ou récupérer des objets dans un flux –Persistance –Transfert sur le réseau

Sérialisation Via la méthode writeObject() –Classe implémentant linterface OutputObject –Exemple : la classe OutputObjectStream –Sérialisation dun objet -> sérialisation de tous les objets contenus par cet objet Un objet est sauvé quune fois : cache pour les listes circulaires

Desérialisation Via la méthode readObject() –Classe implémentant linterface InputObject –Exemple : la classe InputObjectStream

Exception NotSerializableException Si la classe de lobjet sauvé –Nétend ni linterface Java Serializable –Ni linterface Java Externalizable

Interface Serializable Ne contient pas de méthode -> enregistrement et récupération de toutes les variables dinstances (pas de static) + informations sur sa classe (nom, version), type et nom des variables 2 classes compatibles peuvent être utilisées Objet récupéré = une copie de lobjet enregistré

Gestion de la sérialisation desérialisation Implémenter les méthodes private void writeObject(OutputObjectStream s) throws IOException private void readObject(OutputInputStream s) throws IOException defaultReadObject() et defaultWriteObject() méthodes par défaut Ajout dinformations à lenregistrement, choix de sérialisation Seulement pour les champs propres de la classe (héritage géré automatiquement)

Gestion de la sérialisation : utiliser Externalizable Graphe dhéritage complet Implémenter les méthodes public void writeExternal(ObjectOutput o) throws IOException public void readExternal(ObjectInput o) throws IOException –ATTENTION PBM de SECURITE

Un peu plus de réflexivité Les ClassLoader ????

Classe ClassLoader ClassLoader 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 qui constituent 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 afin détendre la façon de dynamiquement charger des classes par la VM. (utilisation de manager de sécurité, par exemple)

ClassLoader ? En UNIX la VM charge les classes à partir des chemins définis dans CLASSPATH. Certaines classes peuvent être obtenues à partir dautres sources, telles que le réseau ou construites par une application. La méthode defineClass convertit un tableau doctets 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 dautres classes (loadClass du class loader de cette classe).

Exemple de 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.

Définir un nouveau type de socket Pourquoi ? Préparer les données avant de les envoyer Reconstruire les données reçues Exemple Java RMI Sockets spécialisées (marshalling et unmarshalling) Exemple Images : Compression et Décompression Comment ? En spécialisant les classes de base

Comment Définir un nouveau type de Sockets La classe CompressionSocket et ses classes relatives 4 é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 limage avant décrire 2. Etendre java.io.FilterInputStream Le read doit décompresser après avoir lu

Comment Définir un nouveau type de Sockets La classe CompressionSocket et ses classes relatives 4 étapes 3. Etendre java.net.Socket Implémenter les constructeurs appropriés et surcharger getInputStream, getOutputStream et close. 4. Etendre java.net.ServerSocket Implémenter le constructeur et surcharger accept pour créer un socket du bon type.

Un « nouveau » Package : java.nio Les principales nouveautés de cette API sont : 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 daccent (caractères Unicode / UTF),

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

Le package Channel SelectableChannel : canal qui peut être multiplexé DatagramChannel Un canal dédié aux communications UDP 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

Le package Channel Et aussi… Selector Un multiplexeur pour des SelectableChannel SelectionKey représentant un canal étiqueté pour le multiplexage Pipe Deux canaux pour construire un pipe unidirectionnel (| shell)

Les nouvelles sockets Ce package définit des classes de canaux qui sont utilisables par les classes de sockets : – DatagramSocket, –ServerSocket, et Socket de java.net package. un canal est créé par appel à une méthode statique open définie dans chaque classe. – La socket est créée par effet de bord.

Exemple : Serveur dheure import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; import java.util.*; import java.util.regex.*;

Exemple : initialisations public class TimeServer { private static int PORT = 8013; private static int port = PORT; // Charset and encoder for US-ASCII private static Charset charset = Charset.forName("US- ASCII"); private static CharsetEncoder encoder = charset.newEncoder(); // Direct byte buffer for writing private static ByteBuffer dbuf = ByteBuffer.allocateDirect(1024);

Exemple : attente de connexion sur le port du service // Open and bind the server-socket channel private static ServerSocketChannel setup() throws IOException { ServerSocketChannel ssc = ServerSocketChannel.open(); InetSocketAddress isa = new InetSocketAddress(InetAddress.getLocalHost(), port); ssc.socket().bind(isa); return ssc; }

Exemple : communication avec un client // Service the next request to come in on the given channel // private static void serve(ServerSocketChannel ssc) throws IOException { SocketChannel sc = ssc.accept(); try { String now = new Date().toString(); sc.write(encoder.encode(CharBuffer.wrap(now + "\n"))); System.out.println(sc.socket().getInetAddress() + " : " + now); sc.close(); } finally { // Make sure we close the channel (and hence the socket) sc.close(); } }

Exemple : code du serveur public static void main(String[] args) throws IOException { if (args.length > 1) { System.err.println("Usage: java TimeServer [port]"); return; } // If the first argument is a string of digits then we take that // to be the port number if ((args.length == 1) && Pattern.matches("[0-9]+", args[0])) port = Integer.parseInt(args[0]); ServerSocketChannel ssc = setup(); for (;;) serve(ssc); } }

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 à lappel de méthodes à distance - Java RMI et une normalisation Corba avec lintégration dun ORB ….