programmation r seaux illustration les sockets en java
Download
Skip this Video
Download Presentation
Programmation Réseaux Illustration : Les Sockets en Java

Loading in 2 Seconds...

play fullscreen
1 / 189

Programmation Réseaux Illustration : Les Sockets en Java - PowerPoint PPT Presentation


  • 115 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Programmation Réseaux Illustration : Les Sockets en Java' - hyman


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
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

r seau et d partement si
Réseau et département SI

Couches Réseaux : protocoles TCP – UDP

Programmation Réseaux

Sockets Java et C

Introduction aux applications réparties

Programmation par Composants

Expériences Industrielles

Administration et sécurité des réseaux

Réseaux sans fil

Applications Temps Réel

SI 4

AL

IAM et SSR

questions pr liminaires
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) ?

architecture client serveur
Architecture client serveur

Mode de communication qu’un hôte établit avec un autre hôte

qui fournit un service quelconque

Serveur

Client

opération

send request

application

send reply

« protocole d’application »

marshalling

comment cela fonctionne au niveau du r seau
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
sockets
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) et

des fichiers

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

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

des fichiers

En sortie (ex. System.out) :

java.io.PrintStream (ouPrintWriter)

utilise unflot dirigé vers une sortie java.io.OutputStream

En entrée (ex. System.in) :

java.io.InputStream (ou BufferedReader)

plus pr cis ment un socket
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

exemples d applications
Exemples d’applications
  • Un serveur d’Echo
  • Un exemple : le service SMTP
  • Demande de citations
  • Diffusion de citations
sockets en java
Sockets en Java ?

BSD sockets UNIX

au dessus de TCP ou UDP

Une infrastructure puissante et

flexible pour la programmation réseau

En Java toutes les classes relatives aux sockets

sont dans le package java.net

le package net
Le Package net
  • Des Exceptions
  • Des entrées Sorties
  • Des Sockets
  • …...

Plusieurs hiérarchies de classes

des types de sockets
Des types de Sockets

Object

ServerSocket

DatagramSocket

MulticastSocket

Socket

des exceptions
Des exceptions

Exception

IOException

SocketException ProtocolException

UnknownHostException UnknownServiceException

BindException ConnectException

des entr es sorties
Des Entrées Sorties

Object

OutputStream

FileOutputStream

ObjectOutputStream

InputStream

FileInputStream

ObjectInputStream

FilterInputStream

DataInputStream

FilterOutputStream

DataOutputStream

autres classes
Autres Classes

Object

InetAdress DatagramPacket SocketImpl

PlainSocketImpl

java net inetaddress nommage
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 la

machine hôte (getLocalHost, getLocalAddress, getLocaName)

Des comparateurs : égalité (equals) et type d’adresse

(isMulticastAddress)

…..

flot de requ tes du client vers le serveur
TCP fournit un transfert fiable,

conservant l’ordre de transfert

des octets (“pipe”)

entre le client et le serveur

Point de vueapplication

Flot de requêtes du client vers le serveur

Serveur

Client

opération

Ouvrir connexion

req1

application

req2

req3

reqn

Fermer la connexion

interaction client server socket tcp
create socket,

connect to hostid, port=x

create socket,

port=x, for

incoming request:

clientSocket =

Socket()

welcomeSocket =

ServerSocket()

TCP

connection setup

wait for incoming

connection request

connectionSocket=

welcomeSocket.accept()

send request using

clientSocket

read request from

connectionSocket

write reply to

connectionSocket

read reply from

clientSocket

close

connectionSocket

close

clientSocket

Interaction Client/server :socket TCP

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

Client

sc nario d un serveur pour un client
Scénario d’un serveurpour un client

Créer le socket de

communication avec le client

Attente de données sur le flux d’entrée

Réception et Analyse des données en entrée

Calcul

Construction de la réponse

Ecriture sur le flux de sortie

Fermer le socket de

communication

sc nario d un client
Scénario d’un client

Créer le socket de connexion

avec le serveur

Attendre que la connexion

soit établie

Récupérer la socket de

communication

Préparer la requête

l’envoyer sur le flux de sortie

Attendre des données sur le flux d’ entrée

les lire et les traiter

Fermer le socket

tcp et sockets
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

transfert de donn es

Transfert de données

Connexion +

« Marshalling »

accepter les connexions dans un serveur
Accepter les connexions Dans un serveur ?

Créer un objet socket pour écouter les demandes de connexion

sur le numéro de port associé au service

Créer un objet socket pour accepter une connexion d ’un client

cet objet servira pour tous les transferts d ’information de

ce client vers le serveur

dans un serveur accepter les connexions
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); }

demander se connecter ouvrir un socket
Demander à se Connecter = ouvrir un socket

Dans un client

identifier lamachine à 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

se connecter comment ouvrir un socket
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)

comment envoyer une information
Comment envoyer une information ?

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

Cô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)

c t serveur
Côté Serveur

Pour envoyer des informations au client

Exemple d’entrée sortie

DataOutputStream : écrire des types de données primitifs;

output=

new DataOutputStream(clientSocket.getOutputStream());

c t client
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);}

…..

comment recevoir de l information
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

c t serveur1
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);}

c t client1
Côté Client

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

DataInputStream : lire des lignes de texte, des entiers, des

doubles,des caractères...

( read, readChar, readInt, readDouble, and readLine,. )

(writeBytes…)

try {input = new DataInputStream(myClient.getInputStream());}

catch (IOException e) {System.out.println(e);}

autres entr es sorties
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.

entr es sorties comment proc der
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 ?

comment se d connecter
Comment se déconnecter ?

Fermer correctement les flux d’entrée sortie et les sockets en cause.

Côté client

Côté serveur

comment fermer un socket
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();

sockets communication client serveur
Sockets (Communication Client serveur)

Le serveur est à l’écoute des requêtes sur un port particulier

Un client doit connaître l’hôte et le port sur lequel le serveur

écoute. Le client peut tenter une connexion au serveur

Le serveur connecte le client sur un nouveau no de port

et reste en attente sur le port original

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

serveur echo
Serveur Echo

Un serveur similaire à echo ( port 7).

Reçoit un texte du client et le renvoie identique

Le serveur gère un seul client.

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

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

} }

comment crire un client
Comment écrire un client ?

Toujours 4 étapes

Ouvrir 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é

client smtp simple mail transfer protocol
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");

}

le protocole smtp rfc1822 3
Le protocole SMTP, RFC1822/3

if (smtpSocket != null && os != null && is != null) {

try{os.writeBytes("HELO\n");

os.writeBytes("MAIL From: \n");

os.writeBytes("RCPT To: \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");

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

} } }

.

tcp et sockets1
TCP et Sockets

La classeServerSocket

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 lequel

le socket écoute, adresse à laquelle il est connecté (getPort,

getInetAddress, …)

des méthodes : accept pour accepter une

communication avec un client, close

...

tcp et sockets2
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

...

applications distribu es et parall lisme

Applications distribuées et parallèlisme

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

interaction client server socket tcp1
create socket,

connect to hostid, port=x

create socket,

port=x, for

incoming request:

clientSocket =

Socket()

welcomeSocket =

ServerSocket()

TCP

connection setup

wait for incoming

connection request

connectionSocket =

welcomeSocket.accept()

send request using

clientSocket

read request from

connectionSocket

write reply to

connectionSocket

read reply from

clientSocket

close

connectionSocket

close

clientSocket

Interaction Client/server :socket TCP

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

Client

plusieurs clients
Plusieurs Clients

Utiliser des threads pour accepter plusieurs clients

simultanément.

Le serveur gère un thread par client

plusieurs clients1
Plusieurs clients

Serveur

Client1

Ouvrir connexion

application

S1

Client2

application

S2

Clientn

Sn

application

quelques mots sur les threads
Quelques mots sur les Threads

Un thread permet l’exécution d’un programme.

Une application peut avoir de multiples threads qui s ’exécutent

concurremment (Chaque thread a une priorité).

Chaque thread a un nom. Plusieurs threads peuvent avoir le

mê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 surcharger

la 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 donc

la méthode run. Une instance de la classe peut être allouée,

passée comme argument à la création d’un thread

et démarrée.

slide53
Scénario du Serveur Multithreadé

while (true)

{ accept a connection ;

create a thread to deal with the client ;

end while

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

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

programmation r seaux illustration les sockets en java partie 2

Programmation RéseauxIllustration : Les Sockets en JavaPARTIE 2

Anne-Marie Déry

À travailler seuls

Concepts généraux

Mise en œuvre Java

besoins d une application client serveur
Besoins d’une application Client-Serveur

Similitudes avec un appel téléphonique via un standard

1. Trouver l’adresse du serveur : trouver le no de téléphone

de l’entreprise

2. 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 ?

un peu de vocabulaire
Un peu de vocabulaire

Client : entité qui fait l ’appel

Sockets : moyen de communication entre ordinateurs

Adresses IP : adresse d’un ordinateur

Serveur : entité qui prend en charge la requête

Serveur de noms (DNS, LDAP) : correspondances entre noms logiques et adresses IP (Annuaire)

Port : canal dédié à un service

Protocole : langage utilisé par 2 ordinateurs pour communiquer entre eux

adresse internet et port
Adresse Internet et Port

Adresse internet

attribuée à chaque nœud du réseau

série d ’octets dont la valeur dépend du type de réseau

associée à un nom logique (Domain Name Server)

Chaque hôte possède environ 65535 ports

Port canal dédié à un service spécifique

80 pour le service http

25 pour le service SMTP

TCP implique une file d’attente par connexion

UDP implique une file d’attente unique pour le port

exemples d adresses internet
Exemples d ’adresses Internet

157.169.9.15 oscar.essi.fr oscar

157.169.20.5 accueil.essi.fr accueil

157.169.20.4 compta.essi.fr compta

157.169.25.201 www-local.essi.fr www-local

157.169.10.222 pcprofs.essi.fr pcprofs

157.169.4.50 ada.essi.fr ada

157.169.10.120 macserver.essi.fr macserver

157.169.10.240 demo.essi.fr demo

157.169.1.20 bibli.essi.fr bibli

157.169.25.110 sfe-srv.essi.fr sfe-srv sfe

157.169.1.153 bde.essi.fr bde

157.169.3.204 niv1a.essi.fr niv1a

157.169.1.155 dessi.essi.fr dessi

157.169.10.2 jessica.essi.fr jessica print2

ypcat hosts sous linux

exemples d adresses
Exemples d ’adresses

157.169.25.200 news-srv.essi.fr news-srv www.essi.fr

www-srv.essi.fr news

134.59.132.21 dolphin.unice.fr

157.169.10.1 essi2.essi.fr loghost essi2

Essi : 157.169

I3S: 134.59

serveurs : 25

Administration : 1

…….

ports r serv s
Ports réservés

1 à 1024 services fondamentaux (administrateurs)

(sous unix cf. le fichier /etc/services, ypcat services)

1025 à 5000 disponibles pour les utilisateurs

TCP

Serveur FTP : 21

Serveur Telnet : 23

Serveur SMTP : 25

UDP

Agent SNMP : 161

Logger SNMP : 162

….

Serveur multi processus

Applications transactionnelles

programmation socket
Une porte à travers laquelle l’application peut à la fois envoyer et recevoir des messages d’une autre application

socket

Programmation Socket

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

  • Deux types de transports via les socket API:
    • Datagramme (non reliable)
    • Orienté flux d’octets (reliable)
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

Programmation socket avec TCP
applications distribu es et parall lisme1

Applications distribuées et parallèlisme

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

interaction client server socket tcp2
create socket,

connect to hostid, port=x

create socket,

port=x, for

incoming request:

clientSocket =

Socket()

welcomeSocket =

ServerSocket()

TCP

connection setup

wait for incoming

connection request

connectionSocket =

welcomeSocket.accept()

send request using

clientSocket

read request from

connectionSocket

write reply to

connectionSocket

read reply from

clientSocket

close

connectionSocket

close

clientSocket

Interaction Client/server :socket TCP

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

Client

plusieurs clients2
Plusieurs Clients

Utiliser des threads pour accepter plusieurs clients

simultanément.

Le serveur gère un thread par client

plusieurs clients3
Plusieurs clients

Serveur

Client1

Ouvrir connexion

application

S1

Client2

application

S2

Clientn

Sn

application

quelques mots sur les threads1
Quelques mots sur les Threads

Un thread permet l’exécution d’un programme.

Une application peut avoir de multiples threads qui s ’exécutent

concurremment (Chaque thread a une priorité).

Chaque thread a un nom. Plusieurs threads peuvent avoir le

mê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 surcharger

la 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 donc

la méthode run. Une instance de la classe peut être allouée,

passée comme argument à la création d’un thread

et démarrée.

slide70
Scénario du Serveur Multithreadé

while (true)

{ accept a connection ;

create a thread to deal with the client ;

end while

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

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

ce que rmi ne sait pas vraiment faire

Ce que RMI ne sait pas vraiment faire ?

Communication asynchrone par messages

Communication par diffusion

communication par message envoi de datagrammes
Communication par message : Envoi de datagrammes

Serveur

Client

opération

req1

application

rep1

reqn

repn

programmation socket avec udp
UDP: pas de “connexion” entre le client et le serveur

Pas de lien privilégié entre le client et le serveur

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 viewpoint

Programmation Socket avec UDP

UDP 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

client server socket interaction udp
create socket,

port=x, for

incoming request:

serverSocket =

DatagramSocket()

create socket,

clientSocket =

DatagramSocket()

Create, address (hostid, port=x,

send datagram request

using clientSocket

read request from

serverSocket

write reply to

serverSocket

specifying client

host address,

port umber

read reply from

clientSocket

close

clientSocket

Client/server socket interaction: UDP

Serveur

Client

sc nario d un serveur
Scénario d’un serveur

Créer le socket d ’entrée

Création d ’un paquet d ’entrée

Attente de données en entrée

Réception et Analyse des données en entrée

Calcul

Création d’un paquet de sortie

Préparation et Envoi de la réponse

Fermer le socket d ’entrée

sc nario d un client1
Scénario d’un client

Créer le socket d ’entrée

Créer un paquet de sortie

Préparer et Envoyer une requête

Créer un paquet d’entrée

Attendre des données en entrée

les recevoir et les traiter

Fermer le socket d ’entrée

datagrammes udp et sockets
Datagrammes UDP et Sockets

Datagramme = un message indépendant envoyé sur le réseau

arrivée, temps d’arrivée et contenu non garantis

2 classes : DatagramPacket et DatagramSocket

packages d’implémentation de

communication via UDP de datagrammes

exemple
Exemple

Un serveur de citation qui écoute un socket type datagram et

envoie une citation si le client le demande

Un client qui fait simplement des requêtes au serveur

ATTENTION Plusieurs firewalls et routeurs sont configurés

pour interdire le passage de paquets UDP

une application client serveur
Une Application Client Serveur

Le serveur reçoit en continu

des paquets mode datagramme sur un socket

un paquet reçu = une demande de citation 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 paquet

datagramme au serveur indiquant qu’il souhaite

recevoir une citation et attend en réponse un paquet

du serveur.

la classe quoteserver
La classe QuoteServer

socket = new DatagramSocket(4445);

Création d’un DatagramSocket sur le port 4445 qui permet au serveur

de 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 contient

une liste de citations ( une citation par ligne)

suite
suite

contient une boucle qui tant qu’il y a des citations dans le fichier

attend 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 le

DatagramSocket au client demandeur.

String dString = null;

if (in == null) dString = new Date().toString();

else dString = getNextQuote();

buf = dString.getBytes();

InetAddress address = packet.getAddress();

int port = packet.getPort();

packet = new DatagramPacket(buf, buf.length, address, port);

socket.send(packet);

suite1
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 citations

on ferme le socket de communication.

socket.close();

la classe quoteclient
La classe QuoteClient

envoie une requête au QuoteServer,

attend la réponse

et affiche la réponse à l’écran.

Variables utilisées :

int port;

InetAddress address;

DatagramSocket socket = null;

DatagramPacket packet;

byte[] sendBuf = new byte[256];

Le client a besoin pour s ’exécuter du nom de la machine sur laquelle

tourne le serveur

if (args.length != 1) {

System.out.println("Usage: java QuoteClient ");

return;

}

la partie principale du main
La partie principale du main

Création d ’un DatagramSocket

DatagramSocket socket = new DatagramSocket();

Le constructeur lie le Socket à un port local libre

Le programme envoie une requête au serveur

byte[] buf = new byte[256];

InetAddress address = InetAddress.getByName(args[0]);

DatagramPacket packet = new DatagramPacket(buf, buf.length,

address, 4445);

socket.send(packet);

Ensuite le client récupère une réponse et l’affiche

classe datagramsocket
Classe DatagramSocket

Des constructeurs : par défaut, + no port + Adresse Inet

Des accesseurs en lecture : adresse à laquelle le socket est lié,

est connecté, le no port auquel il est lié, connecté, taille du

buffer reçu ou envoyé (getInetAddress, getLocalAddress,

getPort, getLocalPort, getReceivedBufferSize,

getSendBufferSize…)

Des méthodes : pour se connecter à une adresse, pour se

déconnecter, pour envoyer un paquet datagramme, pour un

recevoir un paquet datagramme (connect, disconnect, send,

receive)

classe datagrampacket
Classe DatagramPacket

Des constructeurs : buffer + longueur de buffer + adresse

destination + port…

Des accesseurs en lecture : adresse à laquelle le paquet

est envoyé, le no port à laquelle le paquet est envoyé,

la donnée transmise (getAddress, getPort, getData,

getLength…)

communication asynchrone par messages communication par diffusion
Communication asynchrone par messages

Communication par diffusion

communication par message envoi de datagrammes1
Communication par message : Envoi de datagrammes

Serveur

Client

opération

req1

application

rep1

reqn

repn

programmation socket avec udp1
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 viewpoint

Programmation Socket avec UDP

UDP 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

client server socket interaction udp1
create socket,

port=x, for

incoming request:

serverSocket =

DatagramSocket()

create socket,

clientSocket =

DatagramSocket()

Create, address (hostid, port=x,

send datagram request

using clientSocket

read request from

serverSocket

write reply to

serverSocket

specifying client

host address,

port umber

read reply from

clientSocket

close

clientSocket

Client/server socket interaction: UDP

Serveur

Client

sc nario d un serveur1
Scénario d’un serveur

Créer le socket d ’entrée

Création d ’un paquet d ’entrée

Attente de données en entrée

Réception et Analyse des données en entrée

Calcul

Création d’un paquet de sortie

Préparation et Envoi de la réponse

Fermer le socket d ’entrée

sc nario d un client2
Scénario d’un client

Créer le socket d ’entrée

Créer un paquet de sortie

Préparer et Envoyer une requête

Créer un paquet d’entrée

Attendre des données en entrée

les recevoir et les traiter

Fermer le socket d ’entrée

datagrammes udp et sockets1
Datagrammes UDP et Sockets

Datagramme = un message indépendant envoyé sur le réseau

arrivée, temps d’arrivée et contenu non garantis

2 classes : DatagramPacket et DatagramSocket

packages d’implémentation de

communication via UDP de datagrammes

exemple1
Exemple

Un serveur de citation qui écoute un socket type datagram et

envoie une citation si le client le demande

Un client qui fait simplement des requêtes au serveur

ATTENTION Plusieurs firewalls et routeurs sont configurés

pour interdire le passage de paquets UDP

une application client serveur1
Une Application Client Serveur

Le serveur reçoit en continu

des paquets mode datagramme sur un socket

un paquet reçu = une demande de citation 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 paquet

datagramme au serveur indiquant qu’il souhaite

recevoir une citation et attend en réponse un paquet

du serveur.

la classe quoteserver1
La classe QuoteServer

socket = new DatagramSocket(4445);

Création d’un DatagramSocket sur le port 4445 qui permet au serveur

de 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 contient

une liste de citations ( une citation par ligne)

suite2
suite

contient une boucle qui tant qu’il y a des citations dans le fichier

attend 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 le

DatagramSocket au client demandeur.

String dString = null;

if (in == null) dString = new Date().toString();

else dString = getNextQuote();

buf = dString.getBytes();

InetAddress address = packet.getAddress();

int port = packet.getPort();

packet = new DatagramPacket(buf, buf.length, address, port);

socket.send(packet);

suite3
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 citations

on ferme le socket de communication.

socket.close();

la classe quoteclient1
La classe QuoteClient

envoie une requête au QuoteServer,

attend la réponse

et affiche la réponse à l’écran.

Variables utilisées :

int port;

InetAddress address;

DatagramSocket socket = null;

DatagramPacket packet;

byte[] sendBuf = new byte[256];

Le client a besoin pour s ’exécuter du nom de la machine sur laquelle

tourne le serveur

if (args.length != 1) {

System.out.println("Usage: java QuoteClient ");

return;

}

la partie principale du main1
La partie principale du main

Création d ’un DatagramSocket

DatagramSocket socket = new DatagramSocket();

Le constructeur lie le Socket à un port local libre

Le programme envoie une requête au serveur

byte[] buf = new byte[256];

InetAddress address = InetAddress.getByName(args[0]);

DatagramPacket packet = new DatagramPacket(buf, buf.length,

address, 4445);

socket.send(packet);

Ensuite le client récupère une réponse et l’affiche

classe datagramsocket1
Classe DatagramSocket

Des constructeurs : par défaut, + no port + Adresse Inet

Des accesseurs en lecture : adresse à laquelle le socket est lié,

est connecté, le no port auquel il est lié, connecté, taille du

buffer reçu ou envoyé (getInetAddress, getLocalAddress,

getPort, getLocalPort, getReceivedBufferSize,

getSendBufferSize…)

Des méthodes : pour se connecter à une adresse, pour se

déconnecter, pour envoyer un paquet datagramme, pour un

recevoir un paquet datagramme (connect, disconnect, send,

receive)

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

programmation r seaux illustration les sockets en java partie 3

Programmation RéseauxIllustration : Les Sockets en JavaPARTIE 3

Anne-Marie Déry

À travailler seuls

Concepts généraux

Mise en œuvre Java

communication par diffusion multicast
Communication par diffusion : Multicast

Client1

Serveur

Gr

Client2

Clientn

ouvrir un socket demander se connecter
Ouvrir un socket = demander à se Connecter

Les clients demandent seulement à joindre un groupe

exemple de multicast
Exemple de multicast

Un serveur de citation qui envoie une citation toutes les minutes

à tous les clients qui écoutent (multicast)

sc nario d un serveur2
Scénario d’un serveur

Créer le socket d’entrée

Créer un paquet de sortie

Préparer et Envoyer une donnée

Fermer le socket d’entrée

sc nario d un client3
Scénario d’un client

Créer le socket d’entrée

Création d’un paquet d’entrée

Attente de données en entrée

Réception et traitement des données en entrée

Fermer le socket d ’entrée

classe multicastserver
Classe MulticastServer

Des constructeurs : par défaut, port à utiliser

Des accesseurs en lecture : adresse du groupe (getInterface…)

Des méthodes : pour envoyer un paquet datagramme, pour

joindre ou quitter un groupe (send, joinGroup, leaveGroup)

multicast multicastsocket
Multicast: MulticastSocket

Type de socket utilisé côté client pour écouter des paquets que

le serveur « broadcast » à plusieurs clients. .

Une extension du QuoteServer :

broadcast à intervalle régulier à tous ses clients

c ur du serveur
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();}

diff rences principales
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".

un nouveau client
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 à partir

de données du client sur un MulticastSocket. Il aurait pu utiliser aussi

un MulticastSocket. Le socket utilisé par le serveur pour envoyer le

DatagramPacket n’est pas important. Ce qui est important pour le

broadcast est d’adresser l’information contenue dans le DatagramPacket,

et le socket utilisé par le client pour l’écouter.

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

synth se
Synthèse

Client

Serveur

I/O Stream

I/O Stream

TCP aSocket aServerSocket

connectéwriteread

readwrite

UDP aDatagramSocket aDatagramSocket

non connectésendreceive

receivesend

Multicast aMulticastSocket aDatagramSocket/

aMulticastSocket

receivesend

aDatagramPacket

s rialisation des rialisation
Sérialisation-Desérialisation
  • Enregistrer ou récupérer des objets dans un flux
    • Persistance
    • Transfert sur le réseau
s rialisation
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
des rialisation
Desérialisation
  • Via la méthode readObject()
    • Classe implémentant l’interface InputObject
    • Exemple : la classe InputObjectStream
exception notserializableexception
Exception NotSerializableException
  • Si la classe de l’objet sauvé
    • N’étend ni l’interface Java Serializable
    • Ni l’interface Java Externalizable
interface serializable
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é
gestion de la s rialisation des rialisation
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)
gestion compl te de la s rialisation des rialisation utiliser externalizable
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
un peu plus de r flexivit
Un peu plus de réflexivité

Les ClassLoader ????

classe classloader
Classe ClassLoader

ClassLoader est une classe abstraite.

Un class loader est un objet responsable du chargement des classes

Un nom de classe donné, il peut localiser ou générer les données qui

constituent une définition de la classe.

Chaque objet Class a une référence à un ClassLoader qui le définit.

Applications implémentent des sous classes de ClassLoader afin

d’étendre la façon de dynamiquement charger des classes par la VM.

(utilisation de manager de sécurité, par exemple)

classloader
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).

exemple de chargement de classe
Exemple de chargement de classe

Un class loader qui permet de charger des fichiers de classes via

le réseau

ClassLoader loader=new NetworkClassLoader(host,port);

Object main= loader.loadClass("Main", true).newInstance();

….

NetworkClassLoader doit définir findClass et loadClassData pour

charger et defineClass pour créer une instance de Class.

chargement dynamique des classes
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
chargement dynamique
Chargement dynamique
  • 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
hello world chargement dynamique
Hello World : chargement dynamique
  • 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 d marrage du serveur web
Hello World : Démarrage du serveur Web
  • 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 politiques de s curit
Hello World : Politiques de sécurité
  • 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.policy

grant {

permission java.net.SocketPermission

"*:1024-65535", "connect,resolve";

permission java.net.SocketPermission

"*:80", "connect";

};

hello world gestionnaire de s curit rmi
Hello World : gestionnaire de sécurité RMI
  • Le client intègre un gestionnaire de sécurité RMI pour les stubs téléchargés dynamiquement

import java.rmi.*;

import java.rmi.server.*;

public class HelloWorldClient {

public static void main(String[] args) {

try {

// Installe un gestionnaire de sécurité RMI

System.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 d marrage cot serveur
Hello World : Démarrage coté serveur
  • 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 client
Hello World : Démarrage coté client
  • 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

les m thodes d une classe
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, et

private)

getMethods permet d’obtenir aussi les informations concernant les

méthodes héritées

3. 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.

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

exemple d ex cution
Exemple d’exécution

public class method1 {

private int f1(Object p, int x) throws NullPointerException

{……..}

public static void main(String args[]) {….}

name = f1

decl class = class method1

param #0 class java.lang.Object

param #1 int

exc #0 class java.lang.NullPointerException

return type = int

name = main

decl class = class method1

param #0 class java.lang.String

return type = void

programmation r seaux illustration les sockets en java partie 4

Programmation RéseauxIllustration : Les Sockets en JavaPARTIE 4

Anne-Marie Déry

À travailler seuls

Concepts généraux

Mise en œuvre Java

d finir un nouveau type de socket
Définir un nouveau type de socket

Pourquoi ?

Préparer les données avant de les envoyer

Reconstruire les données reçues

Exemple

Java RMI

Sockets spécialisées (marshalling et unmarshalling)

Exemple Images : Compression et Décompression

Comment ?

En spécialisant les classes de base

comment d finir un nouveau type de sockets
Comment Définir un nouveau type de Sockets

La classe CompressionSocket et ses classes relatives

4 étapes

Communication TCP

Définir des E/S Spécifiques

1. Etendre java.io.FilterOutputStream

pour créer un output stream pour ce type de Socket.

Surcharge de méthodes si nécessaire.

Le write doit compresser l’image avant d’écrire

2. Etendre java.io.FilterInputStream

Le read doit décompresser après avoir lu

comment d finir un nouveau type de sockets1
Comment Définir un nouveau type de Sockets

La classe CompressionSocket et ses classes relatives

4 étapes

3. Etendre java.net.Socket

Implémenter les constructeurs appropriés et surcharger

getInputStream, getOutputStream et close.

4. Etendre java.net.ServerSocket

Implémenter le constructeur et surcharger accept

pour créer un socket du bon type.

un nouveau package java nio
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),

un nouveau package java nio1
Un « nouveau » Package : java.nio

Channels : qui représentent des connexions entre entités avec de meilleures performances pour les opérations de lecture et d’écriture

Selectors et selection keys : associées aux selectable channels définissent des E/S multiplexées non bloquantes

évitent les threads

le package channel
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

le package channel1
Le package Channel

Et aussi…

Selector Un multiplexeur pour des SelectableChannel

SelectionKey représentant un canal étiqueté pour le multiplexage

Pipe Deux canaux pour construire un pipe unidirectionnel (| shell)

les nouvelles sockets
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.

exemple serveur d heure
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.*;
exemple initialisations
Exemple : initialisations

public class TimeServer {

private static int PORT = 8013;

private static int port = PORT;

// Charset and encoder for US-ASCII

private static Charset charset = Charset.forName("US-ASCII");

private static CharsetEncoder encoder = charset.newEncoder();

// Direct byte buffer for writing

private static ByteBuffer dbuf = ByteBuffer.allocateDirect(1024);

exemple attente de connexion sur le port du service
Exemple : attente de connexion sur le port du service

// Open and bind the server-socket channel

private static ServerSocketChannel setup() throws IOException

{

ServerSocketChannel ssc = ServerSocketChannel.open(); InetSocketAddress isa =

new InetSocketAddress(InetAddress.getLocalHost(), port);

ssc.socket().bind(isa);

return ssc;

}

exemple communication avec un client
Exemple : communication avec un client

// Service the next request to come in on the given channel //

private static void serve(ServerSocketChannel ssc) throws IOException

{ SocketChannel sc = ssc.accept();

try {

String now = new Date().toString(); sc.write(encoder.encode(CharBuffer.wrap(now + "\n"))); System.out.println(sc.socket().getInetAddress() + " : " + now);

sc.close(); }

finally {

// Make sure we close the channel (and hence the socket) sc.close(); } }

exemple code du serveur
Exemple : code du serveur

public static void main(String[] args) throws IOException {

if (args.length > 1)

{ System.err.println("Usage: java TimeServer [port]"); return; }

// If the first argument is a string of digits then we take that

// to be the port number

if ((args.length == 1) && Pattern.matches("[0-9]+", args[0]))

port = Integer.parseInt(args[0]);

ServerSocketChannel ssc = setup(); for (;;) serve(ssc); } }

conclusion
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

exemple2
Exemple

CLIENT Essifun

SERVEUR de Surnoms

oter

infrastructure

Protocole d’application ?

communication client serveur
Communication client serveur

CLIENT

SERVEUR

Connexion au serveur

Attente de requêtes

Préparation de la requête

Envoi de la requête

Attente du résultat

….

Analyse du résultat reçu

Analyse de la requête

…..

Exécution

….

Préparation de la réponse

Envoi de la réponse

exemple annuaire des surnoms
Exemple : annuaire des surnoms

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

EssiFun

SERVEUR de Surnoms

enregistrer(« paul », 

«bug »)

unmarshalling

marshalling

0111000101000..

enregistrer(« paul »,

«bug ») = TRUE

unmarshalling

marshalling

101..

TRUE

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

que peut on automatiser
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

exemple annuaire des surnoms et rmi
Exemple : annuaire des surnomset RMI

AnnuaireEssi

listePersonnes

enregistrer

lister

oter

Enregistrer(AnneMarie,AM)

lister()

exemple annuaire des surnoms1
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)
slide164
RMI

public interface Surnoms extends java.rmi.Remote

{

public Boolean enregistrer(String nom, String surnom) throws

java.rmi.RemoteException,

ServeurSurnoms.surnoms.ExisteDeja ;

….

}

g n rateurs
Générateurs

Spécifications

des données

Int. Java

IDL

Générateurs

RMIC / Orbix...

Fichiers

générés

Stubs Skeletons Proxy

(mise en œuvre de la sérialisation

et désérialisation…)

rmi classes et interfaces
RMIClasses et Interfaces

Remote

Machine locale

Machine distante

InterfaceDistante

InterfaceDistante

Souche

Squelette

Appel méthode m()

Appel méthode m()

ClasseLocale

ClasseDistante

interaction client enregistreur
Lookup : où est objetDistant ?

client

registre

Il est ici

result

stub

Envoyez le stub

Le voici

stub

squelette

result = objetDistant.m()

objet

Distant

serveur

client

Interaction Client Enregistreur

RMIRegistry + ClassLoader

exemple annuaire des surnoms2
Exemple : annuaire des surnoms

ASN.1 et norme ISO

Protocole := CHOICE {

enregistrerReq [0] SEQUENCE{PrintableString nom,

PrintableString surnom}

enregistrerRep[1] BOOLEAN,

listerReq [2] NULL,

listerRep [3] SET OF Personnes, ….}

XDR et RPC de SUN

Programme surnoms {

version {

boolean enregistrer(nomSurnom) = 1;

listePersonnes lister(void)=2

}= 1

} = 10000

g n rateurs de stubs
Générateurs de Stubs

Spécifications

des données

XDR

ASN1

Générateurs

RPCGEN / MAVROS

Fichiers

générés

Types de

données

C Lisp

Java

Librairie marshalling

et unmarshalling

squelettes du client et

du serveur

Types de

données

C

les points communs des approches distribu es
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ête

Marshalling :

transformation de la requête pour passer sur le

réseau

points communs
Points communs

Protocol :

transmission des requêtes entre exécutables

Dispatching :

gestion des threads

Des services communs

Services de nommage

Interface repository

.....

communication r seaux et internet
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 la

perte 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

slide174
Spécificités des Réseaux Locaux

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 Ethernet

Configuration d’un Firewall : IPTables,

Heureusement Dino est là :-)

quelques interrogations
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 comparer

Identifier les points communs

Interopérabilité : XML une solution suffisante ?

Heureusement Mireille est là 

programmation r seaux qu avez vous retenu

Programmation RéseauxQu’avez-vous retenu ?

Anne-Marie Déry

À travailler seuls

Concepts généraux

Mise en œuvre Java

questions pr liminaires1
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
ad