Programmation R - PowerPoint PPT Presentation

About This Presentation
Title:

Programmation R

Description:

Title: Sockets ? Author: xmoulin Last modified by: Anne-Marie Dery-Pinna Created Date: 9/29/1999 7:36:10 PM Document presentation format: Affichage l' cran (4:3) – PowerPoint PPT presentation

Number of Views:152
Avg rating:3.0/5.0
Slides: 190
Provided by: xmou
Category:

less

Transcript and Presenter's Notes

Title: Programmation R


1
Programmation RéseauxIllustration Les Sockets
en Java
  • Anne-Marie Déry

À travailler seuls
Concepts généraux
Mise en œuvre Java
2
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érience
s Industrielles Administration et sécurité des
réseaux Réseaux sans fil Applications
Temps Réel
SI 4
AL
IAM et SSR
3
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) ?
4
Architecture client serveur
Mode de communication quun hôte établit avec un
autre hôte qui fournit un service quelconque
Serveur
opération
Client
send request
application
send reply
protocole dapplication  marshalling 
5
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 dapplication

6
Sockets
Outil de communication pour échanger des données
entre un client et un serveur
Canaux de communication (descripteur dentrée
sortie dans lesquels on écrit et sur lesquels on
lit) Gestion similaire des entrées sorties
standard (écran, clavier) et des fichiers
7
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 (ou
PrintWriter) utilise un flot dirigé vers une
sortie java.io.OutputStream En entrée (ex.
System.in) java.io.InputStream (ou
BufferedReader)
8
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
9
Exemples dapplications
  • Un serveur dEcho
  • Un exemple le service SMTP
  • Demande de citations
  • Diffusion de citations

10
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
11
Le Package net
  • Des Exceptions
  • Des entrées Sorties
  • Des Sockets
  • ...

Plusieurs hiérarchies de classes
12
Des types de Sockets
Object
ServerSocket
DatagramSocket MulticastSocket
Socket
13
Des exceptions
Exception IOException SocketException Prot
ocolException UnknownHostException UnknownS
erviceException BindException ConnectException

14
Des Entrées Sorties
Object
OutputStream FileOutputStream
ObjectOutputStream
InputStream FileInputStream ObjectInputStream

FilterInputStream DataInputStream
FilterOutputStream DataOutputStream
15
Autres Classes
Object InetAdress DatagramPacket SocketImpl
PlainSocketImpl
16
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 ladresse IP de la machine. Des
accesseurs en lecture pour récupérer ladresse
IP dune machine (getByName, getAllByName), des
informations sur la machine hôte (getLocalHost,
getLocalAddress, getLocaName) Des comparateurs
égalité (equals) et type dadresse
(isMulticastAddress) ..
17
  • Communication Client Serveur traditionnelleFortem
    ent connectée
  • TCP

18
Flot de requêtes du client vers le serveur
Serveur
opération
Client
Ouvrir connexion
req1
application
req2
req3
reqn
Fermer la connexion
19
Interaction Client/server socket TCP
Serveur (sexécutant sur lhôte)
Client
20
Scénario dun serveurpour un client
Créer le socket de communication avec le client
Attente de données sur le flux
dentré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
21
Scénario dun 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 lenvoyer sur le flux de
sortie Attendre des données sur le flux d entrée
les lire et les traiter
Fermer le socket
22
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
23
Transfert de données
  • Connexion
  •  Marshalling 

24
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
25
Dans un serveur ?Accepter les connexions
ServerSocket myService try
myService new ServerSocket(PortNumber)
catch (IOException
e) System.err.println(e) Création dun objet
socket pour écouter et accepter les connexions
des clients Socket clientSocket null
try clientSocket myService.accept()
catch (IOException e)
System.err.println(e)
26
Demander à se Connecter ouvrir un socket
Dans un client identifier 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
27
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 (gt
1023)
28
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 linformation 2 Constituer
le contenu des données à émettre (transformer
entiers, doubles, caractères, objets en lignes
de texte)
29
Côté Serveur
Pour envoyer des informations au client Exemple
dentrée sortie DataOutputStream écrire des
types de données primitifs output new
DataOutputStream(clientSocket.getOutputStream())

30
Côté Client
Côté client pour envoyer une information au
serveur Autre exemple dentrée
sortie PrintStream pour afficher des valeurs des
types de base (write et println) PrintStream
output try output new PrintStream(myClient.get
OutputStream() catch (IOException e)
System.err.println(e) ..
31
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
32
Côté Serveur
pour recevoir les données dun
client DataInputStream input try input new
DataInputStream(clientSocket.getInputStream())
catch (IOException e) System.out.println(e)

33
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.getInputStre
am()) catch (IOException e) System.out.println(
e)
34
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 Loutput doit être
initialisé en premier sinon blocage à la
Création du flux de sortie.
35
Entrées sorties comment procéder ?
Quid du marshalling ? linformation 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 ?
36
Comment se déconnecter ?
Fermer correctement les flux dentrée sortie et
les sockets en cause. Côté client Côté
serveur
37
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()

38
Sockets (Communication Client serveur)
Le serveur est à lécoute des requêtes sur un
port particulier Un client doit connaître lhô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
39
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.
40
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)

41
try clientSocket echoServer.accept()
is new DataInputStream(clientSocket.getInput
Stream()) os new PrintStream(clientSocket
.getOutputStream()) while (true)
line is.readLine()
os.println(line) catch
(IOException e) System.out.println(e
)
42
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é
43
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.getO
utputStream()) 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")

44
Le protocole SMTP, RFC1822/3
if (smtpSocket ! null os ! null is !
null) tryos.writeBytes("HELO\n")
os.writeBytes("MAIL From ltpinna_at_essi.frgt\n")
os.writeBytes("RCPT To
ltpinna_at_essi.frgt\n") os.writeBytes("DATA
\n") os.writeBytes("From
pinna_at_essi.fr\n") os.writeBytes("Subjec
t Qui est là ?\n") os.writeBytes("Vous
suivez toujours ?\n") // message
os.writeBytes("\n.\n")
os.writeBytes("QUIT")
45
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("IOEx
ception " e)
.
46
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 lequel le
socket écoute, adresse à laquelle il est connecté
(getPort, getInetAddress, ) des méthodes
accept pour accepter une communication avec un
client, close ...
47
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 ...
48
Applications distribuées et parallèlisme
  • La communication ne doit pas rester bloquée pour
    un client

49
Interaction Client/server socket TCP
Serveur (sexécutant sur lhôte)
Client
50
Plusieurs Clients
Utiliser des threads pour accepter plusieurs
clients simultanément. Le serveur gère un
thread par client

51
Plusieurs clients
Serveur
Client1
Ouvrir connexion
application
S1
Client2
application
S2
Clientn
Sn
application
52
Quelques mots sur les Threads
Un thread permet lexécution dun 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 dexé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 dun thread et
démarrée.
53
Scénario du Serveur Multithreadé
while (true) accept a connection create
a thread to deal with the client end while
54
  • 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()

55
  • 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()).st
    art() serverSocket.close()

56
Programmation RéseauxIllustration Les Sockets
en JavaPARTIE 2
  • Anne-Marie Déry

À travailler seuls
Concepts généraux
Mise en œuvre Java
57
Besoins dune application Client-Serveur
Similitudes avec un appel téléphonique via un
standard
1. Trouver ladresse du serveur trouver le no
de téléphone de lentreprise 2. Demander un
service spécifique sadresser à un service ou
une personne précise de lentreprise (no de
poste) 3. Faire la requête 4. Obtenir une
réponse
Adresse dun serveur ? Identification dun
service ?
58
Un peu de vocabulaire
Client entité qui fait l appel Sockets moyen
de communication entre ordinateurs Adresses IP
adresse dun 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
59
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 dattente par
connexion UDP implique une file dattente unique
pour le port
60
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
61
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 .
62
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
63
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 doctets (reliable)

64
Programmation socket avec TCP
  • 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
  • Le Client doit contacter le serveur
  • Le processus serveur doit être en train de
    sexécuter
  • Le serveur doit avoir créé un socket qui devient
    le point dentrée des clients
  • Le Client contacte le serveur en
  • Créant un socket TCP client-localement
  • Spécifiant ladresse et le no de port number du
    processus serveur

65
Applications distribuées et parallèlisme
  • La communication ne doit pas rester bloquée pour
    un client

66
Interaction Client/server socket TCP
Serveur (sexécutant sur lhôte)
Client
67
Plusieurs Clients
Utiliser des threads pour accepter plusieurs
clients simultanément. Le serveur gère un
thread par client

68
Plusieurs clients
Serveur
Client1
Ouvrir connexion
application
S1
Client2
application
S2
Clientn
Sn
application
69
Quelques mots sur les Threads
Un thread permet lexécution dun 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 dexé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 dun thread et
démarrée.
70
Scénario du Serveur Multithreadé
while (true) accept a connection create
a thread to deal with the client end while
71
  • 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()

72
  • 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()).st
    art() serverSocket.close()

73
Ce que RMI ne sait pas vraiment faire ?
  • Communication asynchrone par messages
  • Communication par diffusion

74
Communication par message Envoi de datagrammes
Serveur
opération
Client
req1
application
rep1
reqn
repn
75
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
  • Lemetteur attache ladresse IP et le port pour
    le retour.
  • Le serveur doit extraire ladresse IP et le port
    de lexpéditeur à partir du datagramme reçu

UDP fournit un transfert non fiable de groupes
doctets (datagrammes) entre un client et le
serveur
UDP les données transmises peuvent être reçues
dans le désordre ou perdues
76
Client/server socket interaction UDP
Serveur
Client
77
Scénario dun 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 dun paquet de
sortie Préparation et Envoi de la réponse
Fermer le socket d entrée
78
Scénario dun 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 dentrée Attendre
des données en entrée les recevoir et les
traiter
Fermer le socket d entrée
79
Datagrammes UDP et Sockets
Datagramme un message indépendant envoyé sur le
réseau arrivée, temps darrivée et contenu non
garantis
2 classes DatagramPacket et DatagramSocket
packages dimplémentation de communication via
UDP de datagrammes
80
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
81
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 dun client le serveur
envoie en réponse un paquet qui contient une
ligne "quote of the moment" Lapplication
cliente envoie simplement un paquet datagramme au
serveur indiquant quil souhaite recevoir une
citation et attend en réponse un paquet du
serveur.
82
La classe QuoteServer
socket new DatagramSocket(4445) Création dun
DatagramSocket sur le port 4445 qui permet au
serveur de communiquer avec tous ces clients try
in new BufferedReader(new FileReader("one-line
rs.txt")) catch (FileNotFoundExcepti
on 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)
83
suite
contient une boucle qui tant quil y a des
citations dans le fichier attend larrivée d un
DatagramPacket correspondant à une requête client
sur un DatagramSocket. Byte buf new
byte256 DatagramPacket packet new
DatagramPacket(buf, buf.length) socket.receive(p
acket) 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() els
e dString getNextQuote() buf
dString.getBytes() InetAddress address
packet.getAddress() int port
packet.getPort() packet new
DatagramPacket(buf, buf.length, address, port)
socket.send(packet)
84
Suite
Adresse Internet numéro de port (issus du
DatagramPacket ) identification du client pour
que le serveur puisse lui répondre Larrivée du
DatagramPacket implique une requête -gtcontenu
du buffer inutile Le constructeur utilisé pour
le DatagramPacket un tableau doctets
contenant le message et la taille du tableau
Ladresse Internet et un no de port.
Lorsque le serveur a lu toutes les citations on
ferme le socket de communication.
socket.close()
85
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 byte256 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 lthostnamegt") return


86
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
byte256 InetAddress address
InetAddress.getByName(args0) DatagramPacket
packet new DatagramPacket(buf, buf.length,
address, 4445)
socket.send(packet) Ensuite le client récupère
une réponse et laffiche
87
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)
88
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)
89
  • Communication asynchrone par messages
  • Communication par diffusion

90
Communication par message Envoi de datagrammes
Serveur
opération
Client
req1
application
rep1
reqn
repn
91
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
  • Lemetteur attache ladresse IP et le port pour
    le retour.
  • Le serveur doit extraire ladresse IP et le port
    de lexpéditeur à partir du datagramme reçu

UDP fournit un transfert non fiable de groupes
doctets (datagrammes) entre un client et le
serveur
UDP les données transmises peuvent être reçues
dans le désordre ou perdues
92
Client/server socket interaction UDP
Serveur
Client
93
Scénario dun 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 dun paquet de
sortie Préparation et Envoi de la réponse
Fermer le socket d entrée
94
Scénario dun 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 dentrée Attendre
des données en entrée les recevoir et les
traiter
Fermer le socket d entrée
95
Datagrammes UDP et Sockets
Datagramme un message indépendant envoyé sur le
réseau arrivée, temps darrivée et contenu non
garantis
2 classes DatagramPacket et DatagramSocket
packages dimplémentation de communication via
UDP de datagrammes
96
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
97
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 dun client le serveur
envoie en réponse un paquet qui contient une
ligne "quote of the moment" Lapplication
cliente envoie simplement un paquet datagramme au
serveur indiquant quil souhaite recevoir une
citation et attend en réponse un paquet du
serveur.
98
La classe QuoteServer
socket new DatagramSocket(4445) Création dun
DatagramSocket sur le port 4445 qui permet au
serveur de communiquer avec tous ces clients try
in new BufferedReader(new FileReader("one-line
rs.txt")) catch (FileNotFoundExcepti
on 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)
99
suite
contient une boucle qui tant quil y a des
citations dans le fichier attend larrivée d un
DatagramPacket correspondant à une requête client
sur un DatagramSocket. Byte buf new
byte256 DatagramPacket packet new
DatagramPacket(buf, buf.length) socket.receive(p
acket) 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() els
e dString getNextQuote() buf
dString.getBytes() InetAddress address
packet.getAddress() int port
packet.getPort() packet new
DatagramPacket(buf, buf.length, address, port)
socket.send(packet)
100
Suite
Adresse Internet numéro de port (issus du
DatagramPacket ) identification du client pour
que le serveur puisse lui répondre Larrivée du
DatagramPacket implique une requête -gtcontenu
du buffer inutile Le constructeur utilisé pour
le DatagramPacket un tableau doctets
contenant le message et la taille du tableau
Ladresse Internet et un no de port.
Lorsque le serveur a lu toutes les citations on
ferme le socket de communication.
socket.close()
101
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 byte256 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 lthostnamegt") return


102
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
byte256 InetAddress address
InetAddress.getByName(args0) DatagramPacket
packet new DatagramPacket(buf, buf.length,
address, 4445)
socket.send(packet) Ensuite le client récupère
une réponse et laffiche
103
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)
104
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)
105
Programmation RéseauxIllustration Les Sockets
en JavaPARTIE 3
  • Anne-Marie Déry

À travailler seuls
Concepts généraux
Mise en œuvre Java
106
Communication par diffusion Multicast
Client1
Serveur
Gr
Client2
Clientn
107
Ouvrir un socket demander à se Connecter
Les clients demandent seulement à joindre un
groupe
108
Exemple de multicast
Un serveur de citation qui envoie une citation
toutes les minutes à tous les clients qui
écoutent (multicast)
109
Scénario dun serveur
Créer le socket dentrée
Créer un paquet de sortie Préparer et Envoyer une
donnée

Fermer le socket dentrée
110
Scénario dun client
Créer le socket dentrée
Création dun paquet dentrée Attente de données
en entrée Réception et traitement des données en
entrée
Fermer le socket d entrée
111
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)
112
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
113
Cœur du serveur
while (moreQuotes) try
byte buf new byte256 //
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.getByNam
e("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()
114
Différences principales
Le DatagramPacket est construit à partir de de
 ladresse 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). Ladresse InetAddress "230.0.0.1"
correspond à un identificateur de groupe et non
à une adresse Internet de la machine dun
client Le DatagramPacket est destiné à tous les
clients qui écoutent le port 4446 et qui sont
membres du groupe "230.0.0.1".
115
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 ladresse didentification 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 nest pas
important. Ce qui est important pour le broadcast
est dadresser linformation contenue dans le
DatagramPacket, et le socket utilisé par le
client pour lécouter.
116
MulticastSocket socket new MulticastSocket(4446
) InetAddress group
InetAddress.getByName("230.0.0.1")
socket.joinGroup(group) DatagramPacket
packet for (int i 0 i lt 5 i)
byte buf new byte256
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(g
roup) socket.close()

117
Synthèse
Client
Serveur
I/O Stream
I/O Stream
TCP aSocket aServerSocket connecté write read
read write UDP aDatagramSocket aDatagramSo
cket non connecté send receive receive send
Multicast aMulticastSocket aDatagramSocket/
aMulticastSocket receive send
aDatagramPacket
118
Quelques Informations utiles sur la sérialisation
Java
119
Sérialisation-Desérialisation
  • Enregistrer ou récupérer des objets dans un flux
  • Persistance
  • Transfert sur le réseau

120
Sérialisation
  • Via la méthode writeObject()
  • Classe implémentant linterface OutputObject
  • Exemple la classe OutputObjectStream
  • Sérialisation dun objet -gt sérialisation de tous
    les objets contenus par cet objets
  • Un objet est sauvé quune fois cache pour les
    listes circulaires

121
Desérialisation
  • Via la méthode readObject()
  • Classe implémentant linterface InputObject
  • Exemple la classe InputObjectStream

122
Exception NotSerializableException
  • Si la classe de lobjet sauvé
  • Nétend ni linterface Java Serializable
  • Ni linterface Java Externalizable

123
Interface Serializable
  • Ne contient pas de méthode
  • -gt enregistrement et récupération de toutes les
    variables dinstances (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 lobjet enregistré

124
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 dinformations à lenregistrement, choix de
    sérialisation
  • Seulement pour les champs propres de la classe
    (héritage géré automatiquement)

125
Gestion complète de la sérialisation
desérialisation utiliser Externalizable
  • Graphe dhé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

126
Un peu plus de réflexivité
Les ClassLoader ????
127
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)
128
ClassLoader ?
En UNIX la VM charge les classes à partir des
chemins définis dans CLASSPATH. Certaines
classes peuvent être obtenues à partir dautres
sources, telles que le réseau ou construites par
une application. La méthode defineClass
convertit un tableau doctets 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 dautres
classes (loadClass du class loader de cette
classe).
129
Exemple de chargement de classe
Un class loader qui permet de charger des
fichiers de classes via le réseau ClassLoader
loadernew 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.
130
Utilité et utilisation RMI
131
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

132
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

133
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

134
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

135
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"

136
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/Hell
    oWorld") 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()

137
Hello World Démarrage coté serveur
  • 1) Lancer la base de registres RMI (elle doit
    pouvoir accéder aux classes Download - CLASSPATH)
  • gt rmiregistry
  • 2) Lancer le serveur Web servant les fichiers de
    classes Download
  • 3) Lancer le serveur (les classes Server doivent
    être accessibles)
  • gt java HelloWorldServer
  • Création de l'objet serveur...
  • Référencement dans le RMIRegistry...
  • Attente d'invocations - CTRL-C pour stopper

138
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
  • gt java -Djava.security.policyclient.policy
  • -Djava.rmi.server.codebasehttp//www.class-serve
    r.com80/
  • HelloWorldClient

139
Les méthodes dune classe ?
1. récupérer l objet Class que lon 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 dobtenir 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 dexception, et le type de largument
retourné sous la forme dun type fondamental ou
dun objet classe.
140
Exemple de programme
Class cls Class.forName("method1") Method
methlist cls.getDeclaredMethods() for (int
i 0 i lt methlist.length i)
Method m methlisti
System.out.println("name " m.getName())
System.out.println("decl class "
m.getDeclaringClass()) Class pvec
m.getParameterTypes() for (int j 0 j
lt pvec.length j)
System.out.println("param " j " "
pvecj) Class evec
m.getExceptionTypes() for (int j 0 j
lt evec.length j)
System.out.println("exc " j " " evecj)
System.out.println("return type "
m.getReturnType())
141
Exemple dexé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
142
Programmation RéseauxIllustration Les Sockets
en JavaPARTIE 4
  • Anne-Marie Déry

À travailler seuls
Concepts généraux
Mise en œuvre Java
143
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
144
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
limage avant décrire 2. Etendre
java.io.FilterInputStream Le read doit
décompresser après avoir lu
145
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.
146
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),

147
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

148
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

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

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

151
Exemple Serveur dheure
  • import java.io.
  • import java.net.
  • import java.nio.
  • import java.nio.channels.
  • import java.nio.charset.
  • import java.util.
  • import java.util.regex.

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

153
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.get
    LocalHost(), port)
  • ssc.socket().bind(isa)
  • return ssc

154
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().getInetAdd
    ress() " " now)
  • sc.close()
  • finally
  • // Make sure we close the channel (and hence
    the socket) sc.close()

155
Exemple code du serveur
  • public static void main(String args) throws
    IOException
  • if (args.length gt 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
    ", args0))
  • port Integer.parseInt(args0)
  • ServerSocketChannel ssc setup() for ()
    serve(ssc)

156
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 à lappel de méthodes
à distance - Java RMI et une normalisation Corba
avec lintégration dun ORB (cf aaplications
réparties 2nd semestre) et maintenant les EJB
Entreprise Java Beans
157
Retour sur RMI

158
Exemple
CLIENT Essifun
SERVEUR de Surnoms
oter
infrastructure
Protocole dapplication ?
159
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
160
Exemple annuaire des surnoms
1Paulbug 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 ?
161
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
162
Exemple annuaire des surnomset RMI
AnnuaireEssi
listePersonnes
enregistrer lister oter
Enregistrer(AnneMarie,AM) lister()
163
Exemple annuaire des surnoms
  • interface partie visible de lobjet
    (enregistrer, oter, lister, )
  • implémentation partie privée inaccessible
    depuis dautres objets (listePersonnes un
    vecteur de Personne ou un tableau ou .)
  • interface contrat entre lobjet et le monde
    extérieur (save impossible par exemple)

164
RMI
public interface Surnoms extends
java.rmi.
Write a Comment
User Comments (0)
About PowerShow.com