+ All Categories
Home > Documents > Programmation Réseaux Illustration : Les Sockets en Java

Programmation Réseaux Illustration : Les Sockets en Java

Date post: 24-Feb-2016
Category:
Upload: hyman
View: 68 times
Download: 1 times
Share this document with a friend
Description:
Programmation Réseaux Illustration : Les Sockets en Java. Anne-Marie Déry. À travailler seuls. Concepts généraux. Mise en œuvre Java. Réseau et département SI. Couches Réseaux : protocoles TCP – UDP Programmation Réseaux Sockets Java et C Introduction aux applications réparties - PowerPoint PPT Presentation
189
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java
Transcript
Page 1: Programmation Réseaux Illustration : Les Sockets en Java

Programmation RéseauxIllustration : Les Sockets en Java

Anne-Marie DéryÀ travailler seuls

Concepts généraux

Mise en œuvre Java

Page 2: Programmation Réseaux Illustration : Les Sockets en Java

Réseau et département SI

Couches Réseaux : protocoles TCP – UDP

Programmation RéseauxSockets Java et C

Introduction aux applications réparties

Programmation par ComposantsExpériences IndustriellesAdministration et sécurité des réseaux

Réseaux sans filApplications Temps Réel

Page 3: Programmation Réseaux Illustration : Les Sockets en Java

Questions préliminaires

• Différences entre les protocoles de transport TCP et UDP ?

• Utilisation des adresses Internet ?

• Utilisation des ports ?• Programmation sockets :

avantages et inconvénients

Client : ?Serveur : ?Serveur de noms ?(DNS, LDAP) ?

Page 4: Programmation Réseaux Illustration : Les Sockets en Java

Architecture client serveur

Mode de communication qu’un hôte établit avec un autre hôtequi fournit un service quelconque

applicationopération

ClientServeur

send request

send reply

« protocole d’application »marshalling 

Page 5: Programmation Réseaux Illustration : Les Sockets en Java

Comment cela fonctionne au niveau du réseau

– Identification de la machine qui abrite le serveur par le client

– Identification du serveur sur la machine– Canal de communication entre le serveur et le

client– Construction de la trame réseau– Echange du protocole d’application

Page 6: Programmation Réseaux Illustration : Les Sockets en Java

Sockets

Outil de communication pour échanger des données entre un client et un serveur

Canaux de communication (descripteur d’entrée sortie dans lesquels on écrit et sur lesquels on lit)Gestion similaire des entrées sorties standard (écran, clavier) etdes fichiers

Page 7: Programmation Réseaux Illustration : Les Sockets en Java

Un socket : une entrée sortie dédiée au réseau

Gestion similaire des entrées sorties standard (écran, clavier) etdes fichiers

En sortie (ex. System.out) : java.io.PrintStream (ou PrintWriter)

utilise un flot dirigé vers une sortie java.io.OutputStream

En entrée (ex. System.in) : java.io.InputStream (ou BufferedReader)

Page 8: Programmation Réseaux Illustration : Les Sockets en Java

Plus précisément un socket

Plusieurs types de sockets :pour la communication par flot de données

- fortement connectée - synchrone - type client-serveur

pour communication réseau par message - en mode datagramme - en mode déconnecté

pour communication réseau par diffusion

Page 9: Programmation Réseaux Illustration : Les Sockets en Java

Exemples d’applications

• Un serveur d’Echo• Un exemple : le service SMTP

• Demande de citations • Diffusion de citations

Page 10: Programmation Réseaux Illustration : Les Sockets en Java

Sockets en Java ?

BSD sockets UNIXau dessus de TCP ou UDP

En Java toutes les classes relatives aux socketssont dans le package java.net

Une infrastructure puissante etflexible pour la programmation réseau

Page 11: Programmation Réseaux Illustration : Les Sockets en Java

Le Package net

• Des Exceptions• Des entrées Sorties• Des Sockets• …...

Plusieurs hiérarchies de classes

Page 12: Programmation Réseaux Illustration : Les Sockets en Java

Des types de Sockets

ServerSocket DatagramSocket

MulticastSocket

Socket

Object

Page 13: Programmation Réseaux Illustration : Les Sockets en Java

Des exceptionsException

IOException

SocketException ProtocolException UnknownHostException UnknownServiceException

BindException ConnectException

Page 14: Programmation Réseaux Illustration : Les Sockets en Java

Des Entrées SortiesObject

InputStream

FileInputStream ObjectInputStream

OutputStream

FileOutputStream

ObjectOutputStream

FilterInputStream

DataInputStreamFilterOutputStream

DataOutputStream

Page 15: Programmation Réseaux Illustration : Les Sockets en Java

Autres Classes

Object

InetAdress DatagramPacket SocketImpl

PlainSocketImpl

Page 16: Programmation Réseaux Illustration : Les Sockets en Java

Java.net.InetAddress : nommage

La classe InetAddress

2 constructeurs : un par défaut qui crée une adresse vide (cf la méthode accept sur Socket)

un qui prend le nom de la machine hôte et l’adresse IP de la machine.

Des accesseurs en lecture : pour récupérer l’adresse IP d’une machine (getByName, getAllByName), des informations sur lamachine hôte (getLocalHost, getLocalAddress, getLocaName)Des comparateurs : égalité (equals) et type d’adresse (isMulticastAddress)…..

Page 17: Programmation Réseaux Illustration : Les Sockets en Java

Communication Client Serveur traditionnelleFortement connectée

TCP

Page 18: Programmation Réseaux Illustration : Les Sockets en Java

Flot de requêtes du client vers le serveur

applicationopération

ClientServeur

Ouvrir connexionreq1req2req3

reqn

Fermer la connexion

TCP fournit un transfert fiable, conservant l’ordre de transfert

des octets (“pipe”) entre le client et le serveur

Point de vue application

Page 19: Programmation Réseaux Illustration : Les Sockets en Java

Interaction Client/server :socket TCP

Serveur (s’exécutant sur l’hôte) Client

wait for incomingconnection requestconnectionSocket =welcomeSocket.accept()

create socket,port=x, forincoming request:welcomeSocket =

ServerSocket()

create socket,connect to hostid, port=xclientSocket =

Socket()

closeconnectionSocket

read reply fromclientSocket

closeclientSocket

send request usingclientSocketread request from

connectionSocket

write reply toconnectionSocket

TCP connection setup

Page 20: Programmation Réseaux Illustration : Les Sockets en Java

Scénario d’un serveurpour un client

Attente de données sur le flux d’entréeRéception et Analyse des données en entréeCalculConstruction de la réponseEcriture sur le flux de sortie

Fermer le socket de communication

Créer le socket de communication avec le client

Page 21: Programmation Réseaux Illustration : Les Sockets en Java

Scénario d’un client

Préparer la requêtel’envoyer sur le flux de sortieAttendre des données sur le flux d’ entrée les lire et les traiter

Fermer le socket

Créer le socket de connexionavec le serveurAttendre que la connexion soit établieRécupérer la socket de communication

Page 22: Programmation Réseaux Illustration : Les Sockets en Java

TCP et Sockets

2 classes : Socket et ServerSocket (java.net package)pour les canaux de communication

Classes pour le flot de données XInputStream et XOutputStream

Page 23: Programmation Réseaux Illustration : Les Sockets en Java

Transfert de données

Connexion + « Marshalling »

Page 24: Programmation Réseaux Illustration : Les Sockets en Java

Accepter les connexions Dans un serveur ?

Créer un objet socket pour écouter les demandes de connexionsur le numéro de port associé au service

Créer un objet socket pour accepter une connexion d ’un clientcet objet servira pour tous les transferts d ’information de

ce client vers le serveur

Page 25: Programmation Réseaux Illustration : Les Sockets en Java

Dans un serveur ?Accepter les connexions

ServerSocket myService; try { myService = new ServerSocket(PortNumber); } catch (IOException e) {System.err.println(e);}

Création d’un objet socket pour écouter et accepter les connexions des clients

Socket clientSocket = null; try {clientSocket = myService.accept();} catch (IOException e) {System.err.println(e); }

Page 26: Programmation Réseaux Illustration : Les Sockets en Java

Demander à se Connecter = ouvrir un socket

Dans un clientidentifier la machine à laquelle on veut se

connecter et le numéro de port sur lequel tourne le serveur

implique de créer un socket pour cette communication

Page 27: Programmation Réseaux Illustration : Les Sockets en Java

Se connecter Comment ouvrir un socket ?

Dans un client Socket myClient; try { myClient = new Socket("Machine name", PortNumber); } catch (IOException e) { System.out.println(e); }

Machine name : machine à laquelle on veut se connecter PortNumber port sur lequel tourne le serveur (> 1023)

Page 28: Programmation Réseaux Illustration : Les Sockets en Java

Comment envoyer une information ?

Côté client : pour envoyer une requête au serveurCôté serveur : pour envoyer une réponse au client

1 Créer un flux de sortie pour le socket pour écrire l’information

2 Constituer le contenu des données à émettre (transformer entiers, doubles, caractères, objets en lignes de texte)

Page 29: Programmation Réseaux Illustration : Les Sockets en Java

Côté Serveur

Pour envoyer des informations au clientExemple d’entrée sortie

DataOutputStream : écrire des types de données primitifs; output=new DataOutputStream(clientSocket.getOutputStream());

Page 30: Programmation Réseaux Illustration : Les Sockets en Java

Côté Client

Côté client : pour envoyer une information au serveur Autre exemple d’entrée sortie

PrintStream pour afficher des valeurs des types de base(write et println)

PrintStream output;try {output = new PrintStream(myClient.getOutputStream();}catch (IOException e) {System.err.println(e);}

…..

Page 31: Programmation Réseaux Illustration : Les Sockets en Java

Comment recevoir de l ’information ?

Côté serveur : on doit lire la requête du client Côté client : on doit recevoir une réponse du serveur

1 Créer un flux d ’entrée pour le socket et lire l ’information sur le flux

2 Reconstituer les données émises ( entiers, doubles, caractères, objets)à partir des lignes de texte reçues

Page 32: Programmation Réseaux Illustration : Les Sockets en Java

Côté Serveur

pour recevoir les données d’un client

DataInputStream input;try { input = new DataInputStream(clientSocket.getInputStream()); }catch (IOException e) {System.out.println(e);}

Page 33: Programmation Réseaux Illustration : Les Sockets en Java

Côté Client

Côté client : pour recevoir une réponse du serveur

DataInputStream : lire des lignes de texte, des entiers, desdoubles,des caractères... ( read, readChar, readInt, readDouble, and readLine,. )(writeBytes…)

try {input = new DataInputStream(myClient.getInputStream());}catch (IOException e) {System.out.println(e);}

Page 34: Programmation Réseaux Illustration : Les Sockets en Java

Autres entrées sorties

echoSocket = new Socket( "jessica", 7); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream()));

ATTENTION Le BufferedReader prend un Reader en paramètre et non un Stream Utilisation des ObjectInputStream et ObjectOutputStream L’output doit être initialisé en premier sinon blocage à la Création du flux de sortie.

Page 35: Programmation Réseaux Illustration : Les Sockets en Java

Entrées sorties : comment procéder ?

Quid du marshalling ?

l’information qui est lue doit être du même type et du même format que celle qui est écrite

ATTENTION au choix de vos entrées sorties – respecter la Cohérence des données transmises

Le client doit il connaître la nature des E/S du serveur pour être écrit ?

Page 36: Programmation Réseaux Illustration : Les Sockets en Java

Comment se déconnecter ?

Fermer correctement les flux d’entrée sortie et les sockets en cause. Côté clientCôté serveur

Page 37: Programmation Réseaux Illustration : Les Sockets en Java

Comment fermer un socket ?

Fermer les output et input stream avant le socket. Côté client

output.close(); input.close(); myClient.close();Côté serveur output.close(); input.close(); clientSocket.close(); myService.close();

Page 38: Programmation Réseaux Illustration : Les Sockets en Java

Sockets (Communication Client serveur)

Le serveur connecte le client sur un nouveau no de portet reste en attente sur le port original

Client et serveur communiquent en écrivant et lisant sur un socket

Le serveur est à l’écoute des requêtes sur un port particulierUn client doit connaître l’hôte et le port sur lequel le serveur écoute. Le client peut tenter une connexion au serveur

Page 39: Programmation Réseaux Illustration : Les Sockets en Java

Serveur Echo

Un serveur similaire à echo ( port 7). Reçoit un texte du client et le renvoie identiqueLe serveur gère un seul client.

Page 40: Programmation Réseaux Illustration : Les Sockets en Java

Déclarations

import java.io.*; import java.net.*;public class echo3 { public static void main(String args[]) { ServerSocket echoServer = null; String line; DataInputStream is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999);} catch (IOException e) {System.out.println(e); }

Page 41: Programmation Réseaux Illustration : Les Sockets en Java

try { clientSocket = echoServer.accept(); is = new DataInputStream(clientSocket.getInputStream()); os = new PrintStream(clientSocket.getOutputStream()); while (true) { line = is.readLine(); os.println(line); } } catch (IOException e) { System.out.println(e);} } }

Page 42: Programmation Réseaux Illustration : Les Sockets en Java

Comment écrire un client ?

Toujours 4 étapesOuvrir un socket.

Ouvrir un input et un output stream sur le socket. Lire et écrire sur le socket en fonction du protocole du serveur. Effacer Fermer

Seule l’étape 3 change selon le serveur visé

Page 43: Programmation Réseaux Illustration : Les Sockets en Java

Client SMTP (Simple Mail Transfer Protocol),

import java.io.*; import java.net.*; public class smtpClient { public static void main(String[] args) { Socket smtpSocket = null; // le socket client DataOutputStream os = null; // output stream DataInputStream is = null; // input stream try { smtpSocket = new Socket("hostname", 25); os = new DataOutputStream(smtpSocket.getOutputStream()); is = new DataInputStream(smtpSocket.getInputStream()); } catch (UnknownHostException e) { System.err.println("Don't know about host: hostname"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: hostname"); }

Page 44: Programmation Réseaux Illustration : Les Sockets en Java

Le protocole SMTP, RFC1822/3

if (smtpSocket != null && os != null && is != null) { try{os.writeBytes("HELO\n"); os.writeBytes("MAIL From: <[email protected]>\n"); os.writeBytes("RCPT To: <[email protected]>\n"); os.writeBytes("DATA\n"); os.writeBytes("From: [email protected]\n"); os.writeBytes("Subject: Qui est là ?\n"); os.writeBytes("Vous suivez toujours ?\n"); // message os.writeBytes("\n.\n"); os.writeBytes("QUIT");

Page 45: Programmation Réseaux Illustration : Les Sockets en Java

SMTP

// attente de "Ok" du serveur SMTP, String responseLine; while ((responseLine = is.readLine()) != null) { System.out.println("Server: " + responseLine); if (responseLine.indexOf("Ok") != -1) {break;}} os.close(); is.close(); smtpSocket.close(); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException){ System.err.println("IOException: " + e);} } } }

.

Page 46: Programmation Réseaux Illustration : Les Sockets en Java

TCP et Sockets

La classe ServerSocket

des constructeurs : par défaut,no de port associé, + taille de la liste de clients en attente +adresse...

des accesseurs en lecture : no de port sur lequelle socket écoute, adresse à laquelle il est connecté (getPort, getInetAddress, …)

des méthodes : accept pour accepter une communication avec un client, close...

Page 47: Programmation Réseaux Illustration : Les Sockets en Java

TCP et Sockets

La classe Socket :

une batterie de constructeurs : par défaut,no de port + adresse / nom de machine et service distante,+ no de port + adresse locale,créent un socket en mode Stream ou DataGramme

des accesseurs en lecture : no de port et adresse à laquelle il est connecté, no de port et adresse à laquelle il est lié, input et output Stream associés (getPort, getInetAddress, getLocalPort, getLocalAddress, getInputStream, getOutputStream…)

des méthodes : close...

Page 48: Programmation Réseaux Illustration : Les Sockets en Java

Applications distribuées et parallèlisme

La communication ne doit pas rester bloquée pour un client

Page 49: Programmation Réseaux Illustration : Les Sockets en Java

Interaction Client/server :socket TCP

Serveur (s’exécutant sur l’hôte) Client

wait for incomingconnection requestconnectionSocket =welcomeSocket.accept()

create socket,port=x, forincoming request:welcomeSocket =

ServerSocket()

create socket,connect to hostid, port=xclientSocket =

Socket()

closeconnectionSocket

read reply fromclientSocket

closeclientSocket

send request usingclientSocketread request from

connectionSocket

write reply toconnectionSocket

TCP connection setup

Page 50: Programmation Réseaux Illustration : Les Sockets en Java

Plusieurs Clients

Utiliser des threads pour accepter plusieurs clients simultanément.

Le serveur gère un thread par client

Page 51: Programmation Réseaux Illustration : Les Sockets en Java

Plusieurs clients

application

Clientn

ServeurOuvrir connexion

application

Client1

application

Client2 S1

S2

Sn

Page 52: Programmation Réseaux Illustration : Les Sockets en Java

Quelques mots sur les ThreadsUn thread permet l’exécution d’un programme. Une application peut avoir de multiples threads qui s ’exécutentconcurremment (Chaque thread a une priorité). Chaque thread a un nom. Plusieurs threads peuvent avoir lemême. Le nom est généré si non spécifié. Il y a 2 façons de créer un nouveau thread d’exécution.

déclarer une sous classe de Thread et surchargerla méthode run. Une instance de la sous classe peut alorsêtre allouée et démarrer.

déclarer une classe qui implémente Runnable et doncla méthode run. Une instance de la classe peut être allouée, passée comme argument à la création d’un threadet démarrée.

Page 53: Programmation Réseaux Illustration : Les Sockets en Java

while (true) { accept a connection ; create a thread to deal with the client ; end while

Scénario du Serveur Multithreadé

Page 54: Programmation Réseaux Illustration : Les Sockets en Java

public class MultiServerThread extends Thread {

private Socket socket = null; public MultiServerThread(Socket socket) {

super("MultiServerThread"); this.socket = socket; } public void run()

{ try { PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));

…… } out.close(); in.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

Page 55: Programmation Réseaux Illustration : Les Sockets en Java

public class MultiServer {

public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.err.println("Could not listen on port: 4444.");

System.exit(-1); } while (listening) new MultiServerThread(serverSocket.accept()).start();

serverSocket.close(); } }

Page 56: Programmation Réseaux Illustration : Les Sockets en Java

Programmation RéseauxIllustration : Les Sockets en Java

PARTIE 2

Anne-Marie DéryÀ travailler seuls

Concepts généraux

Mise en œuvre Java

Page 57: Programmation Réseaux Illustration : Les Sockets en Java

Besoins d’une application Client-Serveur

Similitudes avec un appel téléphonique via un standard1. Trouver l’adresse du serveur : trouver le no de téléphone de l’entreprise2. Demander un service spécifique : s’adresser à un service ou une personne précise de l’entreprise (no de poste)3. Faire la requête 4. Obtenir une réponse

Adresse d’un serveur ?Identification d’un service ?

Page 58: Programmation Réseaux Illustration : Les Sockets en Java

Un peu de vocabulaire

Client : entité qui fait l ’appelSockets : moyen de communication entre ordinateursAdresses IP : adresse d’un ordinateurServeur : entité qui prend en charge la requêteServeur de noms (DNS, LDAP) : correspondances entre noms logiques et adresses IP (Annuaire)Port : canal dédié à un serviceProtocole : langage utilisé par 2 ordinateurs pour communiquer entre eux

Page 59: Programmation Réseaux Illustration : Les Sockets en Java

Adresse Internet et Port

Adresse internet attribuée à chaque nœud du réseausérie d ’octets dont la valeur dépend du type de réseauassociée à un nom logique (Domain Name Server)

Chaque hôte possède environ 65535 ports

Port canal dédié à un service spécifique80 pour le service http25 pour le service SMTPTCP implique une file d’attente par connexionUDP implique une file d’attente unique pour le port

Page 60: Programmation Réseaux Illustration : Les Sockets en Java

Exemples d ’adresses Internet

ypcat hosts sous linux

157.169.9.15 oscar.essi.fr oscar157.169.20.5 accueil.essi.fr accueil157.169.20.4 compta.essi.fr compta157.169.25.201 www-local.essi.fr www-local157.169.10.222 pcprofs.essi.fr pcprofs157.169.4.50 ada.essi.fr ada157.169.10.120 macserver.essi.fr macserver157.169.10.240 demo.essi.fr demo157.169.1.20 bibli.essi.fr bibli157.169.25.110 sfe-srv.essi.fr sfe-srv sfe157.169.1.153 bde.essi.fr bde157.169.3.204 niv1a.essi.fr niv1a157.169.1.155 dessi.essi.fr dessi157.169.10.2 jessica.essi.fr jessica print2

Page 61: Programmation Réseaux Illustration : Les Sockets en Java

Exemples d ’adresses157.169.25.200 news-srv.essi.fr news-srv www.essi.fr www-srv.essi.fr news134.59.132.21 dolphin.unice.fr157.169.10.1 essi2.essi.fr loghost essi2

Essi : 157.169I3S: 134.59serveurs : 25Administration : 1…….

Page 62: Programmation Réseaux Illustration : Les Sockets en Java

Ports réservés

TCPServeur FTP : 21Serveur Telnet : 23Serveur SMTP : 25

UDPAgent SNMP : 161Logger SNMP : 162….

Serveur multi processus Applications transactionnelles

1 à 1024 services fondamentaux (administrateurs)(sous unix cf. le fichier /etc/services, ypcat services)1025 à 5000 disponibles pour les utilisateurs

Page 63: Programmation Réseaux Illustration : Les Sockets en Java

Programmation Socket

• Deux types de transports via les socket API: – Datagramme (non

reliable)– Orienté flux d’octets

(reliable)

Une porte à travers laquelle l’application

peut à la fois envoyer et recevoir des messages d’une autre application

socket

Comment construire des applications client/server qui communiquent via les sockets

Page 64: Programmation Réseaux Illustration : Les Sockets en Java

Programmation socket avec TCP

Le Client doit contacter le serveur

• Le processus serveur doit être en train de s’exécuter

• Le serveur doit avoir créé un socket qui devient le point d’entrée des clients

Le Client contacte le serveur en • Créant un socket TCP client-

localement• Spécifiant l’adresse et le no

de port number du processus serveur

• Lorsque le client crée le socket: le client TCP établit une connexion avec le serveur TCP

• Lorsque le client le contacte le serveur TCP crée une nouvelle socket pour que le processus serveur communique avec le client– Permet de parler avec

plusieurs clients

Page 65: Programmation Réseaux Illustration : Les Sockets en Java

Applications distribuées et parallèlisme

La communication ne doit pas rester bloquée pour un client

Page 66: Programmation Réseaux Illustration : Les Sockets en Java

Interaction Client/server :socket TCP

Serveur (s’exécutant sur l’hôte) Client

wait for incomingconnection requestconnectionSocket =welcomeSocket.accept()

create socket,port=x, forincoming request:welcomeSocket =

ServerSocket()

create socket,connect to hostid, port=xclientSocket =

Socket()

closeconnectionSocket

read reply fromclientSocket

closeclientSocket

send request usingclientSocketread request from

connectionSocket

write reply toconnectionSocket

TCP connection setup

Page 67: Programmation Réseaux Illustration : Les Sockets en Java

Plusieurs Clients

Utiliser des threads pour accepter plusieurs clients simultanément.

Le serveur gère un thread par client

Page 68: Programmation Réseaux Illustration : Les Sockets en Java

Plusieurs clients

application

Clientn

ServeurOuvrir connexion

application

Client1

application

Client2 S1

S2

Sn

Page 69: Programmation Réseaux Illustration : Les Sockets en Java

Quelques mots sur les ThreadsUn thread permet l’exécution d’un programme. Une application peut avoir de multiples threads qui s ’exécutentconcurremment (Chaque thread a une priorité). Chaque thread a un nom. Plusieurs threads peuvent avoir lemême. Le nom est généré si non spécifié. Il y a 2 façons de créer un nouveau thread d’exécution.

déclarer une sous classe de Thread et surchargerla méthode run. Une instance de la sous classe peut alorsêtre allouée et démarrer.

déclarer une classe qui implémente Runnable et doncla méthode run. Une instance de la classe peut être allouée, passée comme argument à la création d’un threadet démarrée.

Page 70: Programmation Réseaux Illustration : Les Sockets en Java

while (true) { accept a connection ; create a thread to deal with the client ; end while

Scénario du Serveur Multithreadé

Page 71: Programmation Réseaux Illustration : Les Sockets en Java

public class MultiServerThread extends Thread {

private Socket socket = null; public MultiServerThread(Socket socket) {

super("MultiServerThread"); this.socket = socket; } public void run()

{ try { PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));

…… } out.close(); in.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

Page 72: Programmation Réseaux Illustration : Les Sockets en Java

public class MultiServer {

public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.err.println("Could not listen on port: 4444.");

System.exit(-1); } while (listening) new MultiServerThread(serverSocket.accept()).start();

serverSocket.close(); } }

Page 73: Programmation Réseaux Illustration : Les Sockets en Java

Ce que RMI ne sait pas vraiment faire ?

Communication asynchrone par messages

Communication par diffusion

Page 74: Programmation Réseaux Illustration : Les Sockets en Java

Communication par message : Envoi de datagrammes

applicationopération

ClientServeur

req1rep1

reqnrepn

Page 75: Programmation Réseaux Illustration : Les Sockets en Java

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

• L’emetteur attache l’adresse IP et le port pour le retour.

• Le serveur doit extraire l’adresse IP et le port de l’expéditeur à partir du datagramme reçu

application viewpointUDP fournit un transfert

non fiable de groupes d’octets (“datagrammes”)

entre un client et le serveur

UDP: les données transmises peuvent être reçues dans le désordre ou perdues

Page 76: Programmation Réseaux Illustration : Les Sockets en Java

Client/server socket interaction: UDP

closeclientSocket

Serveur

read reply fromclientSocket

create socket,clientSocket = DatagramSocket()

Create, address (hostid, port=x,send datagram request using clientSocket

create socket,port=x, forincoming request:serverSocket = DatagramSocket()

read request fromserverSocket

write reply toserverSocketspecifying clienthost address,port umber

Client

Page 77: Programmation Réseaux Illustration : Les Sockets en Java

Scénario d’un serveur

Création d ’un paquet d ’entréeAttente de données en entréeRéception et Analyse des données en entrée CalculCréation d’un paquet de sortiePréparation et Envoi de la réponse

Fermer le socket d ’entrée

Créer le socket d ’entrée

Page 78: Programmation Réseaux Illustration : Les Sockets en Java

Scénario d’un client

Créer un paquet de sortiePréparer et Envoyer une requête Créer un paquet d’entréeAttendre des données en entrée les recevoir et les traiter

Fermer le socket d ’entrée

Créer le socket d ’entrée

Page 79: Programmation Réseaux Illustration : Les Sockets en Java

Datagrammes UDP et Sockets

2 classes : DatagramPacket et DatagramSocket

Datagramme = un message indépendant envoyé sur le réseau arrivée, temps d’arrivée et contenu non garantis

packages d’implémentation de communication via UDP de datagrammes

Page 80: Programmation Réseaux Illustration : Les Sockets en Java

Exemple

Un serveur de citation qui écoute un socket type datagram et envoie une citation si le client le demandeUn client qui fait simplement des requêtes au serveur

ATTENTION Plusieurs firewalls et routeurs sont configurés pour interdire le passage de paquets UDP

Page 81: Programmation Réseaux Illustration : Les Sockets en Java

Une Application Client Serveur

Le serveur reçoit en continu des paquets mode datagramme sur un socketun paquet reçu = une demande de citation d’un client le serveur envoie en réponse un paquet qui contient

une ligne "quote of the moment"

L’application cliente envoie simplement un paquetdatagramme au serveur indiquant qu’il souhaiterecevoir une citation et attend en réponse un paquetdu serveur.

Page 82: Programmation Réseaux Illustration : Les Sockets en Java

La classe QuoteServer

socket = new DatagramSocket(4445);Création d’un DatagramSocket sur le port 4445 qui permet au serveurde communiquer avec tous ces 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 contientune liste de citations ( une citation par ligne)

Page 83: Programmation Réseaux Illustration : Les Sockets en Java

suite

contient une boucle qui tant qu’il y a des citations dans le fichierattend l’arrivé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 leDatagramSocket 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);

Page 84: Programmation Réseaux Illustration : Les Sockets en Java

Suite

Adresse Internet + numéro de port (issus du DatagramPacket )= identification du client pour que le serveur puisse lui répondre

L’arrivée du DatagramPacket implique une requête ->contenu du buffer inutile

Le constructeur utilisé pour le DatagramPacket : un tableau d’octets contenant le message et la taille du tableau

+ L’adresse Internet et un no de port.

Lorsque le serveur a lu toutes les citationson ferme le socket de communication. socket.close();

Page 85: Programmation Réseaux Illustration : Les Sockets en Java

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 serveurif (args.length != 1) { System.out.println("Usage: java QuoteClient <hostname>"); return; }

Page 86: Programmation Réseaux Illustration : Les Sockets en Java

La partie principale du main

Création d ’un DatagramSocketDatagramSocket 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 l’affiche

Page 87: Programmation Réseaux Illustration : Les Sockets en Java

Classe DatagramSocketDes 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 sedéconnecter, pour envoyer un paquet datagramme, pour un recevoir un paquet datagramme (connect, disconnect, send, receive)

Page 88: Programmation Réseaux Illustration : Les Sockets en Java

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…)

Page 89: Programmation Réseaux Illustration : Les Sockets en Java

Communication asynchrone par messages

Communication par diffusion

Page 90: Programmation Réseaux Illustration : Les Sockets en Java

Communication par message : Envoi de datagrammes

applicationopération

ClientServeur

req1rep1

reqnrepn

Page 91: Programmation Réseaux Illustration : Les Sockets en Java

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

• L’emetteur attache l’adresse IP et le port pour le retour.

• Le serveur doit extraire l’adresse IP et le port de l’expéditeur à partir du datagramme reçu

application viewpointUDP fournit un transfert

non fiable de groupes d’octets (“datagrammes”)

entre un client et le serveur

UDP: les données transmises peuvent être reçues dans le désordre ou perdues

Page 92: Programmation Réseaux Illustration : Les Sockets en Java

Client/server socket interaction: UDP

closeclientSocket

Serveur

read reply fromclientSocket

create socket,clientSocket = DatagramSocket()

Create, address (hostid, port=x,send datagram request using clientSocket

create socket,port=x, forincoming request:serverSocket = DatagramSocket()

read request fromserverSocket

write reply toserverSocketspecifying clienthost address,port umber

Client

Page 93: Programmation Réseaux Illustration : Les Sockets en Java

Scénario d’un serveur

Création d ’un paquet d ’entréeAttente de données en entréeRéception et Analyse des données en entrée CalculCréation d’un paquet de sortiePréparation et Envoi de la réponse

Fermer le socket d ’entrée

Créer le socket d ’entrée

Page 94: Programmation Réseaux Illustration : Les Sockets en Java

Scénario d’un client

Créer un paquet de sortiePréparer et Envoyer une requête Créer un paquet d’entréeAttendre des données en entrée les recevoir et les traiter

Fermer le socket d ’entrée

Créer le socket d ’entrée

Page 95: Programmation Réseaux Illustration : Les Sockets en Java

Datagrammes UDP et Sockets

2 classes : DatagramPacket et DatagramSocket

Datagramme = un message indépendant envoyé sur le réseau arrivée, temps d’arrivée et contenu non garantis

packages d’implémentation de communication via UDP de datagrammes

Page 96: Programmation Réseaux Illustration : Les Sockets en Java

Exemple

Un serveur de citation qui écoute un socket type datagram et envoie une citation si le client le demandeUn client qui fait simplement des requêtes au serveur

ATTENTION Plusieurs firewalls et routeurs sont configurés pour interdire le passage de paquets UDP

Page 97: Programmation Réseaux Illustration : Les Sockets en Java

Une Application Client Serveur

Le serveur reçoit en continu des paquets mode datagramme sur un socketun paquet reçu = une demande de citation d’un client le serveur envoie en réponse un paquet qui contient

une ligne "quote of the moment"

L’application cliente envoie simplement un paquetdatagramme au serveur indiquant qu’il souhaiterecevoir une citation et attend en réponse un paquetdu serveur.

Page 98: Programmation Réseaux Illustration : Les Sockets en Java

La classe QuoteServer

socket = new DatagramSocket(4445);Création d’un DatagramSocket sur le port 4445 qui permet au serveurde communiquer avec tous ces 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 contientune liste de citations ( une citation par ligne)

Page 99: Programmation Réseaux Illustration : Les Sockets en Java

suite

contient une boucle qui tant qu’il y a des citations dans le fichierattend l’arrivé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 leDatagramSocket 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);

Page 100: Programmation Réseaux Illustration : Les Sockets en Java

Suite

Adresse Internet + numéro de port (issus du DatagramPacket )= identification du client pour que le serveur puisse lui répondre

L’arrivée du DatagramPacket implique une requête ->contenu du buffer inutile

Le constructeur utilisé pour le DatagramPacket : un tableau d’octets contenant le message et la taille du tableau

+ L’adresse Internet et un no de port.

Lorsque le serveur a lu toutes les citationson ferme le socket de communication. socket.close();

Page 101: Programmation Réseaux Illustration : Les Sockets en Java

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 serveurif (args.length != 1) { System.out.println("Usage: java QuoteClient <hostname>"); return; }

Page 102: Programmation Réseaux Illustration : Les Sockets en Java

La partie principale du main

Création d ’un DatagramSocketDatagramSocket 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 l’affiche

Page 103: Programmation Réseaux Illustration : Les Sockets en Java

Classe DatagramSocketDes 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 sedéconnecter, pour envoyer un paquet datagramme, pour un recevoir un paquet datagramme (connect, disconnect, send, receive)

Page 104: Programmation Réseaux Illustration : Les Sockets en Java

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…)

Page 105: Programmation Réseaux Illustration : Les Sockets en Java

Programmation RéseauxIllustration : Les Sockets en Java

PARTIE 3

Anne-Marie DéryÀ travailler seuls

Concepts généraux

Mise en œuvre Java

Page 106: Programmation Réseaux Illustration : Les Sockets en Java

Communication par diffusion : Multicast

Clientn

ServeurClient1

Client2Gr

Page 107: Programmation Réseaux Illustration : Les Sockets en Java

Ouvrir un socket = demander à se Connecter

Les clients demandent seulement à joindre un groupe

Page 108: Programmation Réseaux Illustration : Les Sockets en Java

Exemple de multicast

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

Page 109: Programmation Réseaux Illustration : Les Sockets en Java

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 110: Programmation Réseaux Illustration : Les Sockets en Java

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 111: Programmation Réseaux Illustration : Les Sockets en Java

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)

Page 112: Programmation Réseaux Illustration : Les Sockets en Java

Multicast: MulticastSocket

Type de socket utilisé côté client pour écouter des paquets quele serveur « broadcast » à plusieurs clients. .

Une extension du QuoteServer : broadcast à intervalle régulier à tous ses clients

Page 113: Programmation Réseaux Illustration : Les Sockets en Java

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("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 114: Programmation Réseaux Illustration : Les Sockets en Java

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 115: Programmation Réseaux Illustration : Les Sockets en Java

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 116: Programmation Réseaux Illustration : Les Sockets en Java

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 117: Programmation Réseaux Illustration : Les Sockets en Java

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

Page 118: Programmation Réseaux Illustration : Les Sockets en Java

Quelques Informations utiles sur la sérialisation Java

Page 119: Programmation Réseaux Illustration : Les Sockets en Java

Sérialisation-Desérialisation

• Enregistrer ou récupérer des objets dans un flux– Persistance– Transfert sur le réseau

Page 120: Programmation Réseaux Illustration : Les Sockets en Java

Sérialisation

• Via la méthode writeObject()– Classe implémentant l’interface OutputObject

– Exemple : la classe OutputObjectStream

– Sérialisation d’un objet -> sérialisation de tous les objets contenus par cet objets• Un objet est sauvé qu’une fois : cache pour les listes

circulaires

Page 121: Programmation Réseaux Illustration : Les Sockets en Java

Desérialisation

• Via la méthode readObject()– Classe implémentant l’interface InputObject

– Exemple : la classe InputObjectStream

Page 122: Programmation Réseaux Illustration : Les Sockets en Java

Exception NotSerializableException

• Si la classe de l’objet sauvé– N’étend ni l’interface Java Serializable– Ni l’interface Java Externalizable

Page 123: Programmation Réseaux Illustration : Les Sockets en Java

Interface Serializable

• Ne contient pas de méthode• -> enregistrement et récupération de toutes

les variables d’instances (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 l’objet enregistré

Page 124: Programmation Réseaux Illustration : Les Sockets en Java

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 d’informations à l’enregistrement, choix de sérialisation

• Seulement pour les champs propres de la classe (héritage géré automatiquement)

Page 125: Programmation Réseaux Illustration : Les Sockets en Java

Gestion complète de la sérialisation desérialisation : utiliser

Externalizable

• Graphe d’hé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

Page 126: Programmation Réseaux Illustration : Les Sockets en Java

Un peu plus de réflexivité

Les ClassLoader ????

Page 127: Programmation Réseaux Illustration : Les Sockets en Java

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 128: Programmation Réseaux Illustration : Les Sockets en Java

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 129: Programmation Réseaux Illustration : Les Sockets en Java

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

Page 130: Programmation Réseaux Illustration : Les Sockets en Java

Utilité et utilisation RMI

Page 131: Programmation Réseaux Illustration : Les Sockets en Java

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 de clients RMI• Possibilité de créer des gestionnaires de sécurité

personnalisés pour des applications spécifiques• RMI fournit des gestionnaires de sécurité suffisants

pour un usage classique

Page 132: Programmation Réseaux Illustration : Les Sockets en Java

• 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 de l’ objet distant ne changent pas• Le code du serveur ne change pas

• le client et la façon de le démarrer sont modifiés• Et lancer un serveur Web pour nos classes

Chargement dynamique

Page 133: Programmation Réseaux Illustration : Les Sockets en Java

• 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

Page 134: Programmation Réseaux Illustration : Les Sockets en Java

• 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 : Démarrage du serveur Web

Page 135: Programmation Réseaux Illustration : Les Sockets en Java

– 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 136: Programmation Réseaux Illustration : Les Sockets en Java

• 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 137: Programmation Réseaux Illustration : Les Sockets en Java

– 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 138: Programmation Réseaux Illustration : Les Sockets en Java

– 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 139: Programmation Réseaux Illustration : Les Sockets en Java

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ées3. 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 140: Programmation Réseaux Illustration : Les Sockets en Java

Exemple de programme

Class cls = Class.forName("method1"); 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 141: Programmation Réseaux Illustration : Les Sockets en Java

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 142: Programmation Réseaux Illustration : Les Sockets en Java

Programmation RéseauxIllustration : Les Sockets en Java

PARTIE 4

Anne-Marie DéryÀ travailler seuls

Concepts généraux

Mise en œuvre Java

Page 143: Programmation Réseaux Illustration : Les Sockets en Java

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 144: Programmation Réseaux Illustration : Les Sockets en Java

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 145: Programmation Réseaux Illustration : Les Sockets en Java

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 146: Programmation Réseaux Illustration : Les Sockets en Java

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ème de bufferisation liées aux E/S

• Charsets : qui associent des « décodeurs » et des « encodeurs » qui gèrent correctement les conversions chaines – octets– Éliminent les problème de accent (caractères Unicode /

UTF),

Page 147: Programmation Réseaux Illustration : Les Sockets en Java

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 148: Programmation Réseaux Illustration : Les Sockets en Java

Le package Channel

• SelectableChannel : canal qui peut être multiplexé • DatagramChannel Un canal dédié aux communication

UDP prises en charge par des sockets de type java.net.DatagramSocket  

• ServerSocketChannel  : Un canal dédié aux connexion TCP prises en charge par des sockets de type java.net.ServerSocket  

• SocketChannel : Un canal dédié aux communication TCP prises en charge par des sockets de type java.net.Socket

Page 149: Programmation Réseaux Illustration : Les Sockets en Java

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)

Page 150: Programmation Réseaux Illustration : Les Sockets en Java

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.

– In all cases, un canal est créé par appel à une méthode statique open définie dans chaque classe.

– La socket est créée par egget de bord.

Page 151: Programmation Réseaux Illustration : Les Sockets en Java

Exemple : Serveur d’heure

• import java.io.*; • import java.net.*; • import java.nio.*; • import java.nio.channels.*; • import java.nio.charset.*; • import java.util.*; • import java.util.regex.*;

Page 152: Programmation Réseaux Illustration : Les Sockets en Java

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);

Page 153: Programmation Réseaux Illustration : Les Sockets en Java

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; }

Page 154: Programmation Réseaux Illustration : Les Sockets en Java

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(); } }

Page 155: Programmation Réseaux Illustration : Les Sockets en Java

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); } }

Page 156: Programmation Réseaux Illustration : Les Sockets en Java

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(cf aaplications réparties 2nd semestre)

et maintenant les EJB : Entreprise Java Beans

Page 157: Programmation Réseaux Illustration : Les Sockets en Java

Retour sur RMI

Page 158: Programmation Réseaux Illustration : Les Sockets en Java

Exemple

CLIENT Essifun SERVEUR de Surnoms

oter

infrastructure

Protocole d’application ?

Page 159: Programmation Réseaux Illustration : Les Sockets en Java

Communication client serveur

CLIENT SERVEUR

Préparation de la requêteEnvoi de la requêteAttente du résultat….

Analyse du résultat reçu

Connexion au serveur Attente de requêtes

Analyse de la requête…..Exécution….Préparation de la réponseEnvoi de la réponse

Page 160: Programmation Réseaux Illustration : Les Sockets en Java

Exemple : annuaire des surnoms

EssiFun SERVEUR de Surnoms

enregistrer(« paul », «bug »)

marshalling

marshalling

unmarshalling

unmarshalling

0111000101000..

101..

enregistrer(« paul », «bug ») = TRUE

TRUE

1:Paul:bug ou ENR/nPaul/n/bug/n ou Objet Requête Seriablizable

Différence entre un transport TCP et UDP pour le codage des données ?

Page 161: Programmation Réseaux Illustration : Les Sockets en Java

Que peut on automatiser ?

Au minimum, la phase de marshalling/unmarshalling(hétérogéneité des langages, des systèmes, etc)

Selon les cas, le squelette du serveur les appels distants du client

Page 162: Programmation Réseaux Illustration : Les Sockets en Java

Exemple : annuaire des surnomset RMI

enregistrerlisteroter

AnnuaireEssi

listePersonnes

Enregistrer(AnneMarie,AM)lister()

Page 163: Programmation Réseaux Illustration : Les Sockets en Java

Exemple : annuaire des surnoms

• interface : partie visible de l’objet (enregistrer, oter, lister, …)

• implémentation : partie privée inaccessible depuis d’autres objets (listePersonnes : un vecteur de Personne ou un tableau ou ….)

• interface = contrat entre l’objet et le monde extérieur (save impossible par exemple)

Page 164: Programmation Réseaux Illustration : Les Sockets en Java

RMI

public interface Surnoms extends java.rmi.Remote{public Boolean enregistrer(String nom, String surnom) throws

java.rmi.RemoteException, ServeurSurnoms.surnoms.ExisteDeja ;

…. }

Page 165: Programmation Réseaux Illustration : Les Sockets en Java

Générateurs

RMIC / Orbix...

IDL Int. JavaSpécificationsdes données

Générateurs

Fichiersgénérés Stubs Skeletons Proxy

(mise en œuvre de la sérialisationet désérialisation…)

Page 166: Programmation Réseaux Illustration : Les Sockets en Java

RMI

Classes et Interfaces

ClasseLocale

Souche Squelette

ClasseDistante

InterfaceDistante

Remote

Appel méthode m() Appel méthode m()

Machine locale Machine distante

InterfaceDistante

Page 167: Programmation Réseaux Illustration : Les Sockets en Java

Interaction Client Enregistreur

client serveur

client registreLookup : où est objetDistant ?

stub

Il est ici

Envoyez le stub

Le voicistub squelette

objetDistant

result = objetDistant.m()

result

RMIRegistry + ClassLoader

Page 168: Programmation Réseaux Illustration : Les Sockets en Java

Exemple : annuaire des surnoms

XDR et RPC de SUN

Protocole := CHOICE { enregistrerReq [0] SEQUENCE{PrintableString nom,

PrintableString surnom} enregistrerRep[1] BOOLEAN, listerReq [2] NULL, listerRep [3] SET OF Personnes, ….}

Programme surnoms { version {

boolean enregistrer(nomSurnom) = 1; listePersonnes lister(void)=2 }= 1} = 10000

ASN.1 et norme ISO

Page 169: Programmation Réseaux Illustration : Les Sockets en Java

Générateurs de Stubs

RPCGEN / MAVROS

ASN1 XDR

Librairie marshalling et unmarshalling

squelettes du client et du serveur

Spécificationsdes données

Générateurs

Types de donnéesC Lisp Java

Types de données

C

Fichiersgénérés

Page 170: Programmation Réseaux Illustration : Les Sockets en Java

Les points communs des approches distribuées

Adressage : à tout serveur (objet ou programme)doit être affecté une référence unique

Transport : pour établir une communication entre 2 nœuds

et transmettre une requêteMarshalling :

transformation de la requête pour passer sur leréseau

Page 171: Programmation Réseaux Illustration : Les Sockets en Java

Points communs

Protocol :transmission des requêtes entre exécutables

Dispatching :gestion des threads

Des services communsServices de nommageInterface repository.....

Page 172: Programmation Réseaux Illustration : Les Sockets en Java

Restent à approfondir

Page 173: Programmation Réseaux Illustration : Les Sockets en Java

Communication réseaux et Internet

Couches de transport

Différences entre UDP et TCP(Développement d’un serveur multicast Ack/NoAck pour gérer laperte des paquets UDP)

D’autres protocoles (RTP/RTCP)(introduction du routage multicast ou du tunelling)

Principes du IP / protocole ICMP

Service de nommage DNS Configuration services réseau

Page 174: Programmation Réseaux Illustration : Les Sockets en Java

Introduction au Réseaux Locaux LANs Configuration carte réseau d’une machine,Développement d’un analyseur de trafic

et standards IEEE 802 : IEEE 802.3 et EthernetConfiguration d’un Firewall : IPTables,

Spécificités des Réseaux Locaux

Heureusement Dino est là :-)

Page 175: Programmation Réseaux Illustration : Les Sockets en Java

Quelques interrogations ?

Comment choisir le bon middleware (intergiciel) ?Il y en a de plus en plus

Corba, RMI, DCOM, DSA + CCM, J2EE + Web Services, .net ....

Savoir les comparerIdentifier les points communsInteropérabilité : XML une solution suffisante ?

Heureusement Mireille est là

Page 176: Programmation Réseaux Illustration : Les Sockets en Java

Programmation RéseauxQu’avez-vous retenu ?

Anne-Marie DéryÀ travailler seuls

Concepts généraux

Mise en œuvre Java

Page 177: Programmation Réseaux Illustration : Les Sockets en Java

Questions préliminaires

• Différences entre les protocoles de transport TCP et UDP ?

• Utilisation des adresses Internet ?

• Utilisation des ports ?• Programmation sockets :

avantages et inconvénients

Page 178: Programmation Réseaux Illustration : Les Sockets en Java

Lien Types de Socket - Couche de transport

Page 179: Programmation Réseaux Illustration : Les Sockets en Java

Des entrées sorties : Pourquoi ?

Page 180: Programmation Réseaux Illustration : Les Sockets en Java

Différences UDP -TCP

Page 181: Programmation Réseaux Illustration : Les Sockets en Java

Différences Protocole d’application marshalling

Page 182: Programmation Réseaux Illustration : Les Sockets en Java

Quand doit on utiliser des threads ?

Page 183: Programmation Réseaux Illustration : Les Sockets en Java

Différences Sockets Java - C

Page 184: Programmation Réseaux Illustration : Les Sockets en Java

Apports du package nio

Page 185: Programmation Réseaux Illustration : Les Sockets en Java

Protocole d’application RMI

Page 186: Programmation Réseaux Illustration : Les Sockets en Java

Avantages – Inconvénients RMI Socket

Page 187: Programmation Réseaux Illustration : Les Sockets en Java

Différence déploiement statique - dynamique

Page 188: Programmation Réseaux Illustration : Les Sockets en Java

Impact de la Sérialisation d’objets Java sur la communication

Page 189: Programmation Réseaux Illustration : Les Sockets en Java

Réflexivité Java où et pourquoi ?


Recommended