Programmation Client / Serveur

Documents pareils
RMI le langage Java XII-1 JMF

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Remote Method Invocation (RMI)

Remote Method Invocation en Java (RMI)

Remote Method Invocation Les classes implémentant Serializable

Intergiciel - concepts de base

Java Naming and Directory Interface

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Chapitre I Notions de base et outils de travail

Java - RMI Remote Method Invocation. Java - RMI

Calcul Parallèle. Cours 5 - JAVA RMI

Généralités sur le Langage Java et éléments syntaxiques.

Conception de serveurs d'applications ouverts

Programmer en JAVA. par Tama

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

CORBA. (Common Request Broker Architecture)

TP1 : Initiation à Java et Eclipse

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Création d une application JEE

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Plan du cours. Historique du langage Nouveautés de Java 7

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Composants Logiciels. Le modèle de composant de CORBA. Plan

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Héritage presque multiple en Java (1/2)

INITIATION AU LANGAGE JAVA

Java DataBaseConnectivity

Initiation à JAVA et à la programmation objet.

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

as Architecture des Systèmes d Information

Programmation réseau avec Java. 3/7 RMI, un peu de sécurité et CORBA

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

ACTIVITÉ DE PROGRAMMATION

Premiers Pas en Programmation Objet : les Classes et les Objets

2 Chapitre 1 Introduction

Bases Java - Eclipse / Netbeans

Programmation répartie RPC & RMI

La base de données XML exist. A. Belaïd

JOnAS Day 5.1. Clustering

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Systèmes répartis. Fabrice Rossi Université Paris-IX Dauphine. Systèmes répartis p.1/49

Une introduction à Java

Etude critique de mécanismes de sécurité pour l architecture Jini

Java Licence Professionnelle CISII,

Chapitre 10. Les interfaces Comparable et Comparator 1

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Objets et Programmation. origine des langages orientés-objet

Cours 1: Java et les objets

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Langage Java. Classe de première SI

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Le cadre des Web Services Partie 1 : Introduction

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Dis papa, c est quoi un bus logiciel réparti?

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Package Java.util Classe générique

Annexe : La Programmation Informatique

Projet gestion d'objets dupliqués

Chapitre VI- La validation de la composition.

DirXML License Auditing Tool version Guide de l'utilisateur

TP1. Outils Java Eléments de correction

.NET remoting. Plan. Principes de.net Remoting

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

OS Réseaux et Programmation Système - C5

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Java Licence professionnelle CISII,

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

TD/TP PAC - Programmation n 3

Web Tier : déploiement de servlets

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Programmation par les Objets en Java

Systeme d'exploitation

Chapitre 2. Classes et objets

NFP111 Systèmes et Applications Réparties

Auto-évaluation Programmation en Java

Java et les bases de données

OpenPaaS Le réseau social d'entreprise

Programmation des Applications Réparties. Parsers XML DOM et SAX

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation Orientée Objet

Développement, déploiement et sécurisation d'applications JEE

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Projet de programmation (IK3) : TP n 1 Correction

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Sage CRM. 7.2 Guide de Portail Client

Urbanisation des SI. Des composants technologiques disponibles. Urbanisation des Systèmes d'information Henry Boccon Gibod 1

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Java c est quoi? Java pourquoi?

Présentation de Java. Olivier de Pertat IT GROUP

Transcription:

Programmation Client / Serveur Licence Professionnelle CMSII Cours 4 Luiz Angelo Steffenel luiz-angelo.steffenel@univ-reims.fr

Plan du Cours Rappel des mécanismes utilisés Présentation de Java RMI

Client/Serveur les sockets Connexion directe entre client/serveur Conversion des données à charge du développeur

Client/Serveur RPC Connexion entre client/serveur via un proxy Conversion des données à charge du proxy

Objets Distribués Évolution du mécanisme RPC Communication avec des objets distants Localisation des objets distants Transmission d'objets et chargement dynamique de classes

Objets Distribués Java RMI

Java RMI Remote Method Invocation introduit dans Java 1.1 objectifs : moyens : facilité le développement d'application distribuées utilisation de la même syntaxe qu'une application non distribuée (locale) ensemble de classes (API) java.rmi ensemble d'outils de développement ensemble de services réseau Attention : utilisation restreinte à Java

RPC vs RMI RPC entités actives : processus interaction : appel de procédure distante serveur : processus distant les processus supportent des programmes RMI entités actives : objets distribués interaction : invocation de méthode distante serveur : processus distant les objets ont des interfaces distantes plusieurs objets par processus

L'Architecture RMI Utilisation d'interfaces définition de l'interface du côté client (stub) définition de l'implémentation serveur (skeleton) Service de registre des classes

Caractéristiques Masquage des encodages / dés-encodages et des communications méta-éléments (int, float...) locaux transmis par valeur objets locaux transmis par valeur paramètre objets distants transmis par référence Services chargement dynamique des souches garbage collector réparti objets serveurs activable

RMI côté Client Le stub (souche) Mise en forme des requêtes offre la même interface que l'objet serveur lié à un seul serveur génération d'un flot d'octets identification de la méthode Liaison de l'objet client avec l'objet distant gestion de la référence sur le serveur invocation de la méthode

Exemple : un catalogue Nous voulons créer un catalogue de produits, disponible dans le serveur Le client peut demander le prix des produits Pour cela, les objets du côte client (stub) et du côté serveur (squeleton) doivent partager la même interface Java

Interface Catalogue import java.rmi.*; public interface Catalogue extends Remote { } double getprix(string description) throws RemoteException; Les interfaces doivent toujours étendre l'interface Remote Tous les méthodes doivent lancer l'exception RemoteException Les paramètres doivent être sérialisables

Implémentation Côté Serveur import java.rmi.*; import java.rmi.server.*; import java.util.*; public class CatalogueImpl extends UnicastRemoteObject implements Catalogue { private Map<String, Double> lesprix; public CatalogueImpl() throws RemoteException { lesprix = new HashMap<String, Double>(); lesprix.put("barrette memoire 2Go", 24.95); lesprix.put("disque dur 1 To", 49.95); } public double getprix(string description) throws RemoteException { Double prix = lesprix.get(description); return prix == null? 0 : prix; } }

Explication Cette classe est la "cible" de l'appel car elle étend UnicastRemoteObject UnicastRemoteObject indique que l'objet est accessible via une adresse IP unique Si on ne peut pas étendre UnicastRemoteObject, il faut : 1.Créer une instance de l'objet distant 2.Faire appel à UnicastRemoteObject.exportObject(this, 0);

Le service RMI Registry Jusqu'à présent (Sockets, XML-RPC) on savait toujours l'adresse du serveur Codé "en dur" dans le code client Peu pratique si le serveur tombe en panne Empêche le client d'utiliser autre serveur qui offre les mêmes objets Solution : un annuaire d'objets (RMI Registry) On contacte l'annuaire pour avoir la référence à l'objet recherché La référence est un objet (stub) qui se charge de toute communication/conversion de données

Le RMI Registry Programme exécutable fourni pour toutes les plates-formes S'exécute sur un port (1099 par défaut) sur la machine serveur Pour des raisons de sécurité, seuls les objets résidant sur la même machine sont autorisés à lier/délier des références Un service de nommage est lui-même localisé à l'aide d'une URL

RMI Registry vu par le serveur Le serveur doit enregistrer au moins un objet dans l'annuaire RMI Registry Objet avec nom et adresse uniques Ex : rmi://regserv.maboite.com:99/catalogue_central Attention : Le RMI Registry est peu efficient lorsqu'on a trop d'objets enregistrés Il est recommandé d'enregistrer un objet "racine" qui après fait appel à d'autres objets Java se charge de la transmission des stubs au client

La classe Context Du package javax.naming permet de manipuler le RMIRegistry supporte des méthodes statiques permettant de lier des références d'objets serveur Délier des références d'objets serveur Context.unbind(...) Lister le contenu du Naming Context.bind(...) et Context.rebind(...) NamingEnumeratewNameClassPair> Context.list(String nom) Obtenir une référence vers un objet distant Context.lookup(String nom)

import java.rmi.*; import javax.naming.*; public class CatalogueServer { public static void main(string[] args) throws RemoteException, NamingException { System.out.println("Constructing server implementation..."); CatalogueImpl centralcatalogue = new CatalogueImpl(); System.out.println("Binding server implementation to registry..."); Context namingcontext = new InitialContext(); namingcontext.bind("rmi:central_catalogue", centralcatalogue); } } System.out.println("Waiting for invocations from clients...");

RMI Registry vu par le client Le client contacte l'annuaire RMI Registry à la recherche de l'objet initial (bootstrap) Utilisation de l'adresse de l'objet : rmi://regserv.maboite.com:99/catalogue_central Le client peut aussi rechercher la liste des objets enregistrés Utilisation de la méthode list Enumeration<NameClassPair> e = namingcontext.list("rmi://localhost/"); while (e.hasmoreelements()) System.out.println(e.nextElement().getName());

import java.rmi.*; import java.util.*; import javax.naming.*; public class CatalogueClient { public static void main(string[] args) throws NamingException, RemoteException { Context namingcontext = new InitialContext(); System.out.print("RMI registry bindings: "); Enumeration<NameClassPair> e = namingcontext.list("rmi://localhost/"); while (e.hasmoreelements()) System.out.println(e.nextElement().getName()); String url = "rmi://localhost/central_catalogue"; Catalogue centralcatalogue = (Catalogue) namingcontext.lookup(url); String descr = "disque dur 1 To"; double price = centralcatalogue.getprix(descr); System.out.println(descr + ": " + price); } }

Compiler et Déployer le code La méthode "complète" : Séparer le code client du code serveur Utiliser un serveur Web pour fournir le code serveur Lancer RMIRegistry Lancer le client Option ".jar" Au lieu d'utiliser un serveur Web, on peut tout mettre dans un.jar et indiquer ça lors du lancement

La méthode complète Note : il est fortement recommandé de faire ceci en ligne de commande (sans NetBeans) Compiler le code comme d'habitude Séparer les codes client et serveur Rendre l'interface disponible dans le serveur web Serveur/ CatalogueServer.class Catalogue.class CatalogueImpl.class Client/ CatalogueClient.class Catalogue.class Download/ Catalogue.class

La méthode complète Utiliser un serveur web(apache?) ou télécharger NanoHTTPD http://elonen.iki.fi/code/nanohttpd un serveur web dans une seule classe java Compiler NanoHTTPD et mettre le.class dans le répertoire Download Lancer le serveur Web Ouvrir un terminal (invité de commande) java NanoHTTPD 8080

La méthode complète Lancer RMI Registry Ouvrir un terminal (invité de commande) S'assurer que la variable CLASSPATH ne contient aucune entrée S'assurer que le répertoire ne contient aucune classe java rmiregistry (linux) start rmiregistry (Windows) ou javaw rmiregistry

La méthode complète Lancer le serveur Dans une troisième fenêtre de terminal, lancer : java -Djava.rmi.server.codebase=http://localhost:8080/ CatalogueServer Cette commande indique l'adresse du serveur web Le serveur web passera ce lien à rmiregistry Lancer le client Dans une quatrième fenêtre, lancer java CatalogueClient

L'option.jar Le tutoriel de Sun nous donne une autre possibilité qui n'utilise pas un serveur web Compiler l'interface Catalogue.java Créer un.jar à partir de Catalogue.class jar cvf Catalogue.jar Catalogue Compiler le serveur et le client faisant référence à ce.jar javac -cp Catalogue.jar CatalogueServer.java javac -cp Catalogue.jar CatalogueClient.java

L'option.jar Lancer rmiregistry Compiler le serveur et le client faisant référence à ce.jar Lancer le serveur javac -cp Catalogue.jar CatalogueServer.java javac -cp Catalogue.jar CatalogueClient.java java.;catalogue.jar -Djava.rmi.server.codebase= file:/c:/classes/catalogue.jar CatalogueServer Lancer le client java.;catalogue.jar -Djava.rmi.server.codebase= file:/c:/classes/ CatalogueClient

Et la suite? Ça peut paraître beaucoup trop complexe par rapport à XML-RPC mais RMI permet Le chargement dynamique de classes Si le serveur retourne une classe que le client ignore, celui-ci télécharge les classes nécessaires Excellente option pour éviter la surcharge de rmiregistry Il faut modifier les politiques de sécurité de Java L'activation automatique À présent, chaque serveur doit instancier les objets afin de les enregistrer Avec l'activation automatique, le serveur n'enregistre qu'un activateur L'activateur instancie les objets selon le besoin

Autour de RMI CORBA Common Object Request Broker Architecture Architecture qui permet l'appel de méthodes entre objets dans n'importe quel langage Utilise le protocole binaire IIOP (Internet Inter-ORB Protocol) pour la communication Architecture "lourde", de moins en moins utilisée Web Services Collection de protocoles (parfois peu compatibles) basés sur XML Utilise le Simple Object Access Protocol (SOAP) pour le transport d'objets

Références Core Java Volume 2 Par Cay S. Horstmann & Gary Cornell Editions CampusPress Une référence pour les développeurs Java Bonne section sur RMI, servi de base pour ce cours Le tutoriel de Sun http://java.sun.com/docs/books/tutorial/rmi/overview.html

Le projet Modifier le serveur de messagerie Utiliser Java RMI pour la communication entre le client et le serveur Modifier le protocole de manière à établir une session Le mot de passe n'est envoyé qu'une fois Une clé de session est utilisée pour toute autre communication