Java Avancé - Cours 2



Documents pareils
Remote Method Invocation (RMI)

RMI le langage Java XII-1 JMF

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

Remote Method Invocation Les classes implémentant Serializable

Remote Method Invocation en Java (RMI)

Calcul Parallèle. Cours 5 - JAVA RMI

Intergiciel - concepts de base

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

TP1 : Initiation à Java et Eclipse

Tutoriel d installation de Hibernate avec Eclipse

Premiers Pas en Programmation Objet : les Classes et les Objets

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

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

TP1. Outils Java Eléments de correction

Programmation répartie RPC & RMI

Auto-évaluation Programmation en Java

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

Conception de serveurs d'applications ouverts

Corrigé des exercices sur les références

Programmer en JAVA. par Tama

Votre premier projet Android

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Initiation à JAVA et à la programmation objet.

Installation et prise en main

Java Licence professionnelle CISII,

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Bases Java - Eclipse / Netbeans

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Java DataBaseConnectivity

Création d une application JEE

Traitement de données

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Un ordonnanceur stupide

Web Tier : déploiement de servlets

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

Corrigés des premiers exercices sur les classes

Projet gestion d'objets dupliqués

TD/TP PAC - Programmation n 3

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

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

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

TP1 : Initiation à Java et Eclipse

Manuel d implémentation des Web Services Sous Axis1 et Axis2/Tomcat/linux. Par Pr Bouabid EL OUAHIDI

Pharmed. gestion de pharmacie hospitalière. Installation / déploiement

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

1. Installation d'un serveur d'application JBoss:

Introduction à Eclipse

as Architecture des Systèmes d Information

Le Modèle de Sécurité dans JAVA

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Création d un service web avec NetBeans 5.5 et SJAS 9

Synchro et Threads Java TM

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

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

Fichiers d'archives java - *.jar

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

Sécurité Java 2. Première approche. Installation des exemples. Exemple d'une applet

EXA1415 : Annotations

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

Les architectures 3-tiers Partie I : les applications WEB

Programmation par composants (1/3) Programmation par composants (2/3)

TD/TP PAC - Programmation n 3

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Utiliser Java sans BlueJ

Gestion distribuée (par sockets) de banque en Java

TP, première séquence d exercices.

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

Construire des plug-ins pour SAS Management Console SAS 9.1

7 Développement d une application de MapReduce

TP Programmation Java / JDBC / Oracle

Chapitre VI- La validation de la composition.

Java - RMI Remote Method Invocation. Java - RMI

Utilisation d objets : String et ArrayList

Développement Logiciel

Modèle client-serveur Plan. Modèle client-serveur. Modèle client-serveur définition. Modèle client-serveur communication par messages.

INITIATION AU LANGAGE JAVA

Eclipse atelier Java

ACTIVITÉ DE PROGRAMMATION

Warren PAULUS. Android SDK et Android x86

Java Naming and Directory Interface

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Programmation Objet Java Correction

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

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

bbc Launch Pad Juillet 2011 Version 10.0

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

Environnements de développement (intégrés)

Tp 1 correction. Structures de données (IF2)

1 Définition d une classe en Java

Hadoop / Big Data. Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Tutoriel Création d une source Cydia et compilation des packages sous Linux

Module d anonymisation

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

Java au cœur de la base de données Oracle

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours 1: Java et les objets

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Transcription:

Java avancé - cours 2 1/8 Java Avancé - Cours 2 Plan 1 Communication entre objets 1 1.1 Motivation....................................................... 1 1.2 Relations entre le panier et le rayon......................................... 1 1.3 Remote Interface................................................... 2 1.4 Le rayon fruits et légumes.............................................. 2 1.5 Le panier....................................................... 3 2 Ant 4 2.1 Description de Ant.................................................. 4 2.2 Hiérarchie....................................................... 4 2.3 Compilation avec Ant - le tag javac........................................ 4 2.4 Exécuter rmic - le tag rmic............................................. 5 2.5 Exécuter le serveur - le tag java........................................... 5 2.6 Effacer les fichiers générés.............................................. 6 2.7 Invoquer Ant..................................................... 6 3 Exécuter les clients et serveurs RMI 7 3.1 rmiregistry.................................................... 7 3.2 Lancer le serveur................................................... 7 3.3 Lancer le client.................................................... 7 4 Exercices 7 Le but de ce cours est de détailler un mécanisme de communication directement entre des objets java distants. Cette méthode nommée RMI (Remote Method Invocation) permet qu un objet java donné puisse appeler une méthode d un objet java situé sur une autre machine. 1 Communication entre objets 1.1 Motivation Aujourd hui un serveur Web possède une architecture qui peut être complexe. Quand google me donne une réponse à ma recherche, le serveur Web qui me répond ne possède pas en local sur son disque les 4 milliards de pages. Il communique donc avec d autres machines. Java étant facilement utilisé dans les serveurs Web, il est dès lors important de pourvoir communiquer directement entre les objets. Le but de cette section est de réaliser un exemple où deux objets communiquent entre eux: un objet Panier, qui contient un entier représentant le nombre de pommes dans le panier, un objet Rayon qui contient un certain nombre de pommes, et qui possède une méthode permettant de retirer ou d ajouter une pomme. 1.2 Relations entre le panier et le rayon Il nous faut tout d abord définir les relations entre le panier dans lequel nous mettons les pommes et le rayon dans lequel nous les prenons. le panier envoie au rayon un objet permettant de savoir combien de pommes il faut prendre, le rayon reçoit cet objet et renvoie pour information le nombre de pommes restantes dans l étalage.

Java avancé - cours 2 2/8 1.3 Remote Interface La communication entre le client et le serveur (e.g., le panier et le rayon) est codé par deux classes constituant la remote interface. Nous mettons les classes de la remote interface dans un paquetage nommé boutique. Voici tout d abord la définition du rayon d un magasin, il possède deux méthodes permettant d ajouter ou de retirer des pommes. package boutique; // les classes vont être définies dans boutique.* import java.rmi.remote; import java.rmi.remoteexception; public interface Rayon extends Remote { Object ajoutepomme(changerayon t) throws RemoteException; Object retirepomme(changerayon t) throws RemoteException; Tout d abord la déclaration package boutique indique que les déclarations à venir vont être faites dans le package boutique. Ainsi pour utiliser ce qui va être définit il faudra utiliser un commande import boutique.* ou bien référencer explicitement les noms. On constate ensuite l usage du mot clé interface au lieu de class dans la déclaration de Rayon cela signifie que Rayon n est pas une classe dont on va pouvoir directement créer des instances en faisant new Rayon. Il faut voir l interface comme un contrat, ainsi en écrivant l interface Rayon il suffit de donner le prototype des méthode et non leur corps. Voici ensuite les données que l on fournit à l interface boutique.rayon, qui donne le nombre d articles que l on souhaite prendre : package boutique; import java.io.serializable; public interface ChangeRayon extends Serializable { Object nombredarticles(); ChangeRayon hérite de Serializable. Cela signifie que les instances de ChangeRayon peuvent être transformées en une suite de caractères permettant de sauvegarder l objet. C est cette sauvegarde qui va être l information qui va circuler entre les machines. 1.4 Le rayon fruits et légumes Nous allons maintenant construire un rayon précis, le rayon fruits et légumes qui va devoir respecter l interface précédente. Cette classe sera dans un paquetage nommé mesrayons: package mesrayons; import boutique.changerayon; import boutique.rayon; public class FruitsEtLegumes extends java.rmi.server.unicastremoteobject implements boutique.rayon { int nombredepommes=0; public FruitsEtLegumes() throws java.rmi.remoteexception { super(); nombredepommes=10;

Java avancé - cours 2 3/8 public Object ajoutepomme(changerayon t) { nombredepommes=nombredepommes +((Integer)(t.nombreDArticles())).intValue(); System.out.println("Il y a maintenant "+nombredepommes+" pomme(s)"); return new Integer(nombreDePommes); public Object retirepomme(changerayon t) { int pommesaretirer = ((Integer)(t.nombreDArticles())).intValue(); if (nombredepommes>=pommesaretirer) nombredepommes=nombredepommes-pommesaretirer; else pommesaretirer=0; System.out.println("Il y reste "+nombredepommes+" pomme(s) en rayon"); return new Integer(pommesARetirer); On remarque que le constructeur par défaut du rayon fruits et légumes met 10 pommes dans le rayon. Puis les méthodes ajoutepomme et retirepomme sont implémentées. Nous allons ensuite rajouter une méthode main pour pouvoir créer une instance de FruitsEtLegumes : public static void main(string[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager (new java.rmi.rmisecuritymanager()); try { Rayon monrayon = new FruitsEtLegumes(); java.rmi.naming.rebind("maboutique", monrayon); System.out.println("FruitsEtLegumes bound"); catch (Exception e) { System.err.println("FruitsEtLegumes exception: " + e.getmessage()); e.printstacktrace(); // fin de la classe FruitsEtLegumes 1.5 Le panier Il reste maintenant à écrire la classe panier.panier qui va demander des pommes au rayon : package panier; import java.rmi.*; import boutique.rayon; import boutique.changerayon; public class Panier { public static void main(string args[]) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); try { String name = "//" + args[0] + "/maboutique"; Rayon fruitsetlegumes = (Rayon) Naming.lookup(name); ChangeRayon changement = new Changement(Integer.parseInt(args[1])); Integer pommesobtenues =

Java avancé - cours 2 4/8 (Integer)fruitsEtLegumes.retirePomme(changement); System.out.println("Il y a "+pommesobtenues +" pomme(s) dans le panier."); catch (Exception e) { System.err.println("Panier exception: " + e.getmessage()); e.printstacktrace(); Il ne reste plus qu à écrire une implémentation de la classe boutique.changerayon, qui va simplement enrober un objet de type int : package panier; public class Changement implements boutique.changerayon { int monnombredarticles=0; Changement(int n) { monnombredarticles=n; public Object nombredarticles() { return new Integer(monNombreDArticles); 2 Ant 2.1 Description de Ant Ant (http://ant.apache.org) est un programme permettant de ne pas taper toutes les informations de compilation sur la ligne de commande. Ant est utilisé par les IDE NetBeans et Eclipse (donc pas besoin de le télécharger si Netbeans ou Eclipse est déjà installé). Un fichier Ant est un fichier XML, généralement nommé build.xml. Ce fichier est l équivalent d un Makefile (www. gnu.org/software/make). 2.2 Hiérarchie On suppose que l on part de la hiérarchie suivante: build.xml java.policy + src + boutique ChangeRayon.java Rayon.java + mesrayons FruitsEtLegumes.java + panier Changement.java Panier.java 2.3 Compilation avec Ant - le tag javac Un fichier ant commence par une balise projet composant la cible par défaut à exécuter (ici rmic que nous verrons plus loin):

Java avancé - cours 2 5/8 <?xml version="1.0"?> <project name="jar" basedir="." default="rmic"> Créons ensuite une cible pour compiler toute notre arborescence située dans le dossier src <target name="compile"> <mkdir dir="build"/> <!-- creation du repertoire --> <javac srcdir="src" <!-- compilation des *.java --> destdir="build" debug="on"/> </target> Quand cette cible sera exécutée, le répertoire build sera crée, puis toute l arborescence des fichier *.java sera copiée dans build en étant transformée en fichier *.class. On obtient en plus de la hiérarchie précédente : + build + classes + boutique ChangeRayon.class Rayon.class + mesrayons FruitsEtLegumes.class + panier Changement.class Panier.class 2.4 Exécuter rmic - le tag rmic Les interfaces distantes doivent être compilées en utilisant un utilitaire spécial nommé rmic. Il peut être invoqué sur la ligne de commande par la séquence : >rmic -v1.1 -d build/classes mesrayons.fruitsetlegumes ou de manière similaire par la cible Ant suivante : <target name="rmic" depends="compile"> <rmic stubversion="1.1" classname="mesrayons.fruitsetlegumes" base="build/classes" /> </target> L attribut depends="compile" sert à demander l exécution préalable de la cible nommée compile. On obtient en plus de la hiérarchie précédente : + build + classes + mesrayons FruitsEtLegumes_Skel.class FruitsEtLegumes_Stub.class Les classes * Skel.class et * Stub.class servent à prendre en charge automatiquement la sérialisation et la communication réseau. 2.5 Exécuter le serveur - le tag java L exécution du serveur se fait par la ligne de commande suivante : java -Djava.rmi.server.codebase=file:/chemin/vers/les/classes \ -Djava.rmi.server.hostname=localhost \ -Djava.security.policy=java.policy \ -cp build/classes mesrayons.fruitsetlegumes

Java avancé - cours 2 6/8 Panier FruitsEtLegumes_Stub machine 1 appel de methode echange de donnees FruitsEtLegumes FruitsEtLegumes_Skel machine 2 Figure 1: Classes * Skel et * Stub. ou par la cible Ant suivante: <target name="serveur" depends="rmic"> <java classname="mesrayons.fruitsetlegumes" fork="true"> <sysproperty key="java.rmi.server.codebase" value="file:/chemin/vers/les/classes/"/> <sysproperty key="java.rmi.server.hostname" value="localhost"/> <sysproperty key="java.security.policy" value="java.policy"/> <classpath> <!-- rajoute un répertoire --> <pathelement path="build/classes"/> <!-- rajoute une archive jar --> <pathelement location="/chemin/vers/archive.jar"/> </classpath> </java> </target> 2.6 Effacer les fichiers générés On peut également rajouter la cible ci-dessous pour effacer les fichiers générés: <target name="clean"> <delete dir="build"/> <delete> <fileset dir="." includes="**/* " defaultexcludes="no"/> <fileset dir="." includes="**/*.jar" defaultexcludes="no"/> </delete> </target> Il faut alors fermer la balise project pour clore le fichier Ant. </project> 2.7 Invoquer Ant Pour génére le jar à partir de tous les fichiers source, il suffit de taper ant >ant Buildfile: build.xml compile: [mkdir] Created dir: /chemin/vers/build [mkdir] Created dir: /chemin/vers/build/classes [javac] Compiling 5 source files to /chemin/vers/build/classes rmic: [rmic] RMI Compiling 1 class to /chemin/vers/build/classes BUILD SUCCESSFUL Total time: 2 seconds

Java avancé - cours 2 7/8 On remarque que c est tout d abord la cible compile qui s exécute, puis la cible rmic. Si un fichier source *.java a été modifié, seul ce dernier sera compilé par une nouvelle invocation de ant. Pour effacer les fichiers générés taper ant clean. 3 Exécuter les clients et serveurs RMI 3.1 rmiregistry Il faut tout d abord lancer l entité qui va permettre au serveur de s enregistrer. Ceci se fait en invoquant sur la ligne de commande : UNIX (bash): export CLASSPATH=/chemin/vers/mes/point_class rmiregistry & UNIX (csh): setenv CLASSPATH /chemin/vers/mes/point_class rmiregistry & Windows: # fixer la variable d environnement classpath start rmiregistry Une autre alternative sous Unix ou Windows consiste à lançer rmiregistry dans le répertoire où sont les packages contenant les *.class. 3.2 Lancer le serveur Une fois le fichier build.xml précédent constitué, le serveur se lance simplement par la commande : ant serveur Il faut au préalable avoir créer le fichier java.policy dont voici un exemple possible: grant { permission java.net.socketpermission "*:1024-65535", "connect,accept,resolve"; ; 3.3 Lancer le client Une fois le fichier build.xml précédent constitué, le client se lance simplement par la commande : ant client 4 Exercices Exercice 2.1 Q1 Récupérer le source donné dans le cours à l url : http://www.derepas.com/java/cours2_exercice_1.jar. Le décompresser à l aide de la commande jar xvf cours2 exercice 1.jar. Mettre les bons chemins dans le fichier build.xml. Exécuter le client et le serveur, à l aide de la commande ant. Q2 On souhaite rendre l interface boutique.rayon plus générique. Créer une classe boutique.article qui contient simplement une chaine de caractères. Transformer les méthodes de boutique.rayon : En : Object ajoutepomme(changerayon t) throws RemoteException; Object retirepomme(changerayon t) throws RemoteException;

Java avancé - cours 2 8/8 Object ajoutearticle(changerayon t) throws RemoteException; Object retirearticle(changerayon t) throws RemoteException; La classe ChangeRayon étant alors tranformée en public interface ChangeRayon extends Serializable { Object nombredarticles(); /** * retourne le type d article concerné par le changement. */ Object article(); Transformer les implémentations correspondantes. Exercice 2.2 Le but de l exercice est de créer un mini serveur de chat. Q1 Il faut tout d abord définir les interfaces. On va disposer de deux classes : une classe serveur sur laquelle on dispose d une méthode ecrit(string nomutilisateur, String phrase), qui permet d envoyer une phrase pour un utilisateur. une classe client sur laquelle on dispose d une méthode notifie(string nomutilisateur, String phrase), qui permet à un client de chat de recevoir du texte. Écrire ces interfaces. Q2 Écrire une implémentation des interfaces précédentes permettant de réaliser le serveur de chat.