Le réseau est. (Bill Joy)

Documents pareils
Remote Method Invocation (RMI)

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

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Développement Logiciel

Calcul Parallèle. Cours 5 - JAVA RMI

RMI le langage Java XII-1 JMF

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

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Remote Method Invocation en Java (RMI)

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Projet de programmation (IK3) : TP n 1 Correction

Flux de données Lecture/Ecriture Fichiers

Programmation Internet en Java

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

Programmation client-serveur sockets - RPC

Remote Method Invocation Les classes implémentant Serializable

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

Auto-évaluation Programmation en Java

Programmation Réseau SSH et TLS (aka SSL)

Programmer en JAVA. par Tama

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Java - RMI Remote Method Invocation. Java - RMI

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Conception de serveurs d'applications ouverts

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

PROGRAMMATION PAR OBJETS

Java Licence Professionnelle CISII,

INITIATION AU LANGAGE JAVA

OS Réseaux et Programmation Système - C5

TP1 : Initiation à Java et Eclipse

Synchro et Threads Java TM

Entrées / Sorties. Entrées / Sorties. Entrées/Sorties. System.out. Fonctionnement par flots (stream) Karima Boudaoud IUT- R&T. Terrain connu.

Cours 6 : Programmation répartie

Un ordonnanceur stupide

Le modèle client-serveur

Cahier des Charges du Projet Domotique. Choquet Mathieu Masson Jérôme Groupe 6. Domotique. p.1

2 Chapitre 1 Introduction

Programmation répartie RPC & RMI

Threads. Threads. USTL routier 1

Premiers Pas en Programmation Objet : les Classes et les Objets

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

Principes des Architectures Middleware version 2.0

Introduction au langage Java

Intergiciel - concepts de base

Projet gestion d'objets dupliqués

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

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

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

Package Java.util Classe générique

Le Modèle de Sécurité dans JAVA

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

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

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

Programmation Par Objets

Introduction : les processus. Introduction : les threads. Plan

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

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

Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)

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

Programmation Objet Java Correction

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Corrigé des exercices sur les références

Une introduction à Java

Web Tier : déploiement de servlets

Java DataBaseConnectivity

as Architecture des Systèmes d Information

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

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

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

Programme Compte bancaire (code)

Java Naming and Directory Interface

Architecture Orientée Service, JSON et API REST

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

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

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

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

Création d une application JEE

Programmation avancée et répartie en Java : interfaçage avec d autres langages

Chapitre I Notions de base et outils de travail

TD3: tableaux avancées, première classe et chaînes

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

M1 MIAGE - Réseau TP1

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

Intégration d'un système d'audio-vidéo conférence sur un robot de téléprésence

Java 1.5 : principales nouveautés

Cours 1: Java et les objets

OpenPaaS Le réseau social d'entreprise

Derrière toi Une machine virtuelle!

Langage Java. Classe de première SI

Bases Java - Eclipse / Netbeans

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Une introduction à la technologie EJB (2/3)

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

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

TP Programmation Java / JDBC / Oracle

Interfaces graphiques avec l API Swing

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

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Transcription:

Le réseau est l ordinateur (Bill Joy)

Le package java.net

Les principales classes du package java.net Les sockets en mode connecté Les sockets en mode non connecté ServerSocket accept()... Socket getinputstream() getoutputstream()... DatagramSocket receive( DatagramPacket p ) send( DatagramPacket p )... InetAdress getbyname( String host )... Benoît Charroux - Programmation réseau - Septembre 07-3

Un serveur ayant 1 client unique : Le client : Un client/serveur en mode connecté ServerSocket socket = new ServerSocket( 2010 ) ; Socket client = socket.accept() ; InputStream in = client.getinputstream() ; // OutputStream out = client.getoutputstream() ; client.close() ; InetAddress adresseserveur = InetAddress.getByName( nommachine ) ; Socket client = new Socket( adresseserveur, 2010 ) ; OutputStream out = client.getoutputstream() ; //... InputStream in = client.getinputstream() ; client.close() ; Benoît Charroux - Programmation réseau - Septembre 07-4

La sérialisation d objets au travers d un réseau

Rappels sur la sérialisation d objets L API de sérialisation : ObjectOutputStream( OutputStream ) writeobject( Object ) sérialiser ObjectInputStream( InputStream ) Object readobject() désérialiser Champs sérialiasables de l objet Champs sérialisables des super-classes ObjectStreamClass nomdelaclasse serialversionuid Benoît Charroux - Programmation réseau - Septembre 07-6

Exemple de sérialisation coté serveur public static void main( String [] args ){ try{ Bidon bidon = new Bidon() ; ServerSocket socket = new ServerSocket( 2001 ) ; Socket client = socket.accept() ; OutputStream fluxsocket = client.getoutputstream() ; // objet à sérialiser // crée un serveur // attend un client // client -> flux // créé un flux de sérialisation et écrit dans le flux ObjectOutputStream flux = new ObjectOutputStream( fluxsocket ) ; flux.writeobject( bidon ) ; flux.flush() ; flux.close() ; fluxsocket.close() ; client.close() ; socket.close() ; catch( IOException e ) { Benoît Charroux - Programmation réseau - Septembre 07-7

Exemple de désérialisation public Object loadobject( String nommachine ) throws IOException, ClassNotFoundException { // récupère l adresse du serveur à partir de son nom InetAddress adresseserveur = InetAddress.getByName( nommachine ) ; // créé un client et se connecte au serveur Socket client = new Socket( adresseserveur, 2001 ) ; InputStream fluxsocket = client.getinputstream() ; // client -> flux // créé un flux de désérialisation et lit l objet ObjectInputStream flux = new ObjectInputStream( fluxsocket ) ; return flux.readobject() ; public static void main( String [] args ){ ChargeObject client = new ChargeObjet() ; try{ Bidon bidon = (Bidon)client.loadObject( "localhost" ) ; catch( Exception e ) { // Benoît Charroux - Programmation réseau - Septembre 07-8

Extension du chargeur de classes

Le chargeur de classes La machine virtuelle Java charge les classes au moment de l exécution (en général la variable CLASSPATH définit le chemin de recherche des fichiers *.class). Comment redéfinir un chargeur de classe pour une application particulière : charger une classe au travers d un réseau? public class ClasseLocale { // class ClasseDistante objetdistant = new ClasseDistante() ; Chargeur de classes Machine virtuelle Système de fichier réseau Machine virtuelle Système de fichier Benoît Charroux - Programmation réseau - Septembre 07-10

Le chargeur de classes La classe ClassLoader est une classe abstraite dont il faut définir la méthode abstraite loadclass. Object tracer() ClassLoader defineclass loadclass findsystemclass resolveclass Benoît Charroux - Programmation réseau - Septembre 07-11

Le chargeur de classes : principe class MonChargeur extends ClassLoader{ public synchronized Class loadclass(string classname, boolean resolve) throws ClassNotFoundException { Vérifier si la classe n a pas déjà été chargée, si oui : résoudre la classe et la retourner ; Vérifier si la classe est dans le CLASSPATH ou dans les classes du système, si oui : la retourner ; Télécharger la classe et l enregistrer dans un fichier ; Lire le fichier de classe ; Définir la classe : convertir un tableau de byte en un objet de type Class ; Résoudre la classe : résoudre les références à d autres classes (indispensable pour créer une instance de la classe avec la méthode newinstance) ; Retourner la classe. Benoît Charroux - Programmation réseau - Septembre 07-12

Exemple d un chargeur de classes sur un réseau class MonChargeur extends ClassLoader{ private Hashtable classes = new Hashtable() ; // ensemble de classes public synchronized Class loadclass(string classname, boolean resolve) throws ClassNotFoundException { try { Class newclass = (Class)classes.get( classname ) ; // déjà chargée? if( newclass == null ){ try{ newclass = findsystemclass( classname ) ; // fichier local? if( newclass!= null ) return newclass ; catch (ClassNotFoundException e) { telechargeclasse( "localhost", classname ) ; // télécharge byte-code byte [] buffer = chargefichier( classname ) ; // lit fichier newclass = defineclass( classname, buffer, 0, buffer.length ) ; // créé Class classes.put( classname, newclass ) ; // ajoute à l ensemble if( resolve ) resolveclass( newclass ) ; // résout la classe return newclass ; catch( IOException e ) { throw new ClassNotFoundException( e.tostring() ) ; Benoît Charroux - Programmation réseau - Septembre 07-13

Le chargeur de classes : téléchargement coté client class MonChargeur extends ClassLoader{ // // ouvre une socket pour récupérer le byte-code // redirige la socket vers un flot d entrée // écrit le byte-code dans un fichier private void telechargeclasse( String nommachine, String classname ) throws IOException{ InetAddress adresseserveur = InetAddress.getByName( nommachine ) ; Socket client = new Socket( adresseserveur, 2010 ) ; InputStream fluxsocket = client.getinputstream() ; int byteslus ; FileOutputStream fichierout = new FileOutputStream( classname +".class" ); while ((byteslus = fluxsocket.read())!= -1 ) fichierout.write( byteslus ); fichierout.close() ; Benoît Charroux - Programmation réseau - Septembre 07-14

Le chargeur de classes : téléchargement coté serveur public static void main( String [] args ){ try{ ServerSocket socket = new ServerSocket( 2010 ) ; // créé un serveur Socket client = socket.accept() ; // accepte un client OutputStream fluxsocket = client.getoutputstream() ; // socket -> flot FileInputStream in = new FileInputStream( "Bidon.class" ) ; // ouvre fichier int bytelu ; while ((bytelu = in.read())!= -1) { // lit fichier fluxsocket.write(bytelu); in.close() ; fluxsocket.close() ; client.close() ; socket.close() ; catch( IOException e ) { System.out.println( e ) ; Benoît Charroux - Programmation réseau - Septembre 07-15 // envoi byte

Le chargeur de classes : transfert du byte-code vers un tableau de byte class MonChargeur extends ClassLoader{ // // transfert du byte-code d un fichier vers un tableau de byte private byte [] chargefichier( String classname ) throws IOException, ClassNotFoundException{ FileInputStream fichierin = new FileInputStream( classname + ".class" ) ; int length = fichierin.available() ; // taille du fichier if( length == 0 ) throw new ClassNotFoundException( classname ) ; byte [] buffer = new byte[ length ] ; fichierin.read( buffer ) ; return buffer ; Benoît Charroux - Programmation réseau - Septembre 07-16

Le chargeur de classes Une classe chargée dans la machine virtuelle Java ne peut pas être explicitement déchargée ; En autorisant la récupération du chargeur par le ramasse-miettes, on ne pourra plus charger de classe par son intermédiaire : MonChargeur monchargeur = new MonChargeur() ; // monchageur = null ; Benoît Charroux - Programmation réseau - Septembre 07-17

public class ChargeurReseau extends ClassLoader{ public ChargeurReseau( String nomserveur, int port ) throws IOException{ InetAddress adresseserveur = InetAddress.getByName( nomserveur ) ; client = new Socket( adresseserveur, port ) ; //2001 ) ; private void telechargeclasse( String classname ) throws IOException{ InputStream inputstream ; OutputStream outputstream ; ObjectOutputStream p ; BufferedWriter writer ; writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); writer.write( classname, 0, classname.length() ) ; writer.newline() ; writer.flush() ; inputstream = client.getinputstream() ; DataInputStream datainputstream = new DataInputStream( inputstream ) ; taillefichier = datainputstream.readint() ; buffer = new byte[ taillefichier ] ; for( int i=0; i<taillefichier; i++ ){ buffer[ i ] = (byte)inputstream.read() ; Benoît Charroux - Programmation réseau - Septembre 07-18

Remote Method Invocation

Remote Method Invocation Java permet de réaliser un appel de méthodes à distance (Remote Method Invocation) : Registre Objet distant Récupère une référence sur l objet distant et appel une méthode distante Client Squelette réseau Stub Benoît Charroux - Programmation réseau - Septembre 07-20

Remote Method Invocation enregistrement Naming bind lookup Récupère une référence remote MonInterface remote methode MonInterface methode réseau compile Client ServeurDeMethode methode Appel de méthode distante Benoît Charroux - Programmation réseau - Septembre 07-21

Remote Method Invocation coté client remote L interface distante : package paquetageinterface; public interface Bonjour extends java.rmi.remote{ public String disbonjour() throws java.rmi.remoteexception ; Le programme client (classe Client ): Bonjour disbonjour package paquetageclient; Client import paquetageinterface.bonjour; import java.rmi.registry.*; try{ Registry registry = LocateRegistry.getRegistry( "host name", 2001 ); Bonjour stub = (Bonjour) registry.lookup( "Monsieur" ); String reponse = stub.disbonjour(); catch( Exception e ){ Benoît Charroux - Programmation réseau - Septembre 07-22 compile

package paquetageserveur; import java.rmi.serveur.unicastremoteobject; import java.rmi.registry.*; import paquetageinterface; public class ImplementationBonjour implements Bonjour { public ImplementationBonjour () { super(); public String disbonjour() { return "Heu... bonjour!"; Remote Method Invocation coté serveur Naming rebind lookup remote public static void main(string args[]) { Bonjour try { disbonjour if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); Bonjour obj = new ImplementationBonjour(); Bonjour stub = (Bonjour) UnicastRemoteObject.exportObject(obj,0); Registry registry = LocateRegistry.getRegistry(); registry.bind("monsieur", stub); ImplemantationBonjour catch (Exception e) { e.printstacktrace(); disbonjour Benoît Charroux - Programmation réseau - Septembre 07-23

Les étapes pour utiliser RMI : Utilisation de RMI codage de l interface ; création d un fichier jar pour l interface ; codage du serveur ; compilation côté serveur ; démarrage de l annuaire d objets ; création d un fichier déclarant la politique de sécurité utilisée ; démarrage du serveur ; donner physiquement le fichier jar contenant l interface au développeur du client ; codage du client ; compilation côté client ; création d un fichier déclarant la politique de sécurité utilisée ; démarrage du client. Pour plus de détails : http://java.sun.com/docs/books/tutorial/rmi/overview.html Benoît Charroux - Programmation réseau - Septembre 07-24

Les plus et les moins de RMI Les plus : l enregistrement d un seul objet dans le service de nommage suffit rendre accessible plusieurs objets du serveur : il suffit que des méthodes de l objet enregistré retournent des objets présent sur le serveur ; une méthode sur le serveur peut appeler une méthode d un client si ce dernier à été transmis comme argument d une méthode du serveur! si le serveur est derrière un pare-feu qui ne laisse passer que HTTP, les appels de méthode sous automatiquement déroutées par le démon HTTP du serveur ; les moins : si le client est derrière un pare-feu, il lui faudra un démon HTTP pour que le déroutage des requête passe par HTTP ; dans une méthode appelée à distance, il est impossible d utiliser une quelconque méthode de l appelant => utiliser des threads ; Un objet retourné par une méthode distante puis renvoyé à l émetteur sera considéré comme distant par l émetteur! Benoît Charroux - Programmation réseau - Septembre 07-25

Communiquer avec un serveur web via HTTP

La classe HTTPURLConnection Un programme Java qui communique avec un serveur web : URL url = new URL( "http://www..." ); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setusecaches( true ); // utilise des fichiers temporaires côté client connection.setifmodifiedsince(... ); // n accède qu aux fichiers récents connection.connect(); int responsecode = connection.getresponsecode(); if( responsecode == HttpURLConnection.HTTP_NOT_FOUND ){... else if( responsecode!=httpurlconnection.http_ok ){ long filelength = connection.getcontentlength(); InputStream inputstream = connection.getinputstream();... // TO DO : une boucle pour télécharger le fichier à l URL connection.disconnect();... Benoît Charroux - Programmation réseau - Septembre 07-27

Les applets

Les applets : principe Les applets sont des programme Java téléchargés à partir d un serveur WEB et qui s exécutent dans le browser d un client : Fichier.html <APPLET CODEBASE=http://machin.truc.fr/bidon code=appletbidon.class width=200 height=100> </APPLET> Browser du client Demande la page Fichier.html Télécharge la page Fichier.html Demande la class appletbidon Télécharge la classe appletbidon appletbidon.class Serveur WEB Benoît Charroux - Programmation réseau - Septembre 07-29

Détail du téléchargement d une applets Fichier.html <APPLET CODEBASE=http://machin.truc.fr/bidon code=appletbidon.class width=200 height=100></applet> Le browser : réserve une surface rectangulaire de 200*100 pixels se connecte au port 80 du serveur http://machin.truc.fr/bidon demande le fichier appletbidon.class (GET /bidon/appletbidon.class HTTP/1.0) le serveur : transmet le fichier le browser : stocke le fichier dans un tableau d octets la machine virtuelle Java du browser : vérifie le byte-code charge la classe correspondante si la classe requiert une autre classe Java, celle ci est recherché dans le CLASSPATH du client, puis sur le serveur Benoît Charroux - Programmation réseau - Septembre 07-30

Les applets et la sécurité Les applets peuvent s exécuter en toute sécurité dans un browser car elles ne peuvent pas : accéder aux système de fichier du client ; appeler des programmes sur la machine cliente : System.exec() ou Runtime.exec(); redéfinir les classes : ClassLoader, SecurityManager, SocketImplFactory, avec la version 1.2, il est possible d assouplir la sécurité avec des applets signées. Ce qu il est parfois possible de faire : ouvrir une socket vers le serveur d où provient l applet (attention au firewall) ; appeler une méthode distante via RMI. Benoît Charroux - Programmation réseau - Septembre 07-31

Méthode appelée une fois pour initialiser l applet Méthode appelée à chaque fois que l applet devient visible Méthode appelée à chaque fois que l applet devient invisible La classe Applet Applet init start stop destroy getcodebase getdocumentbase getparameter getimage getaudioclip play... Méthode appelée une fois pour détruire l applet Utilisées pour savoir où s exécute l applet Récupère des paramètres dans un document HTML Voir le chapitre : L Abstract Windowing Toolkit pour le dessin. Benoît Charroux - Programmation réseau - Septembre 07-32

Récupérer des paramètres d un fichier HTML <applet code="clock" width=50 height=50> <param name=color value="blue"> </applet> Fichier.html Sring param = getparameter("color") ; System.out.println( param ) ; // à l écran : blue Benoît Charroux - Programmation réseau - Septembre 07-33

Sample Applet