Programmation R - PowerPoint PPT Presentation

1 / 53
About This Presentation
Title:

Programmation R

Description:

Programmation R seaux Illustration : Les Sockets en Java Anne-Marie D ry travailler seuls Concepts g n raux Mise en uvre Java – PowerPoint PPT presentation

Number of Views:85
Avg rating:3.0/5.0
Slides: 54
Provided by: xmo
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
  • Communication asynchrone par messages
  • Communication par diffusion

3
Communication par message Envoi de datagrammes
Serveur
opération
Client
req1
application
rep1
reqn
repn
4
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
5
Client/server socket interaction UDP
Serveur
Client
6
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
7
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
8
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.
9
La classe QuoteServer
socket new DatagramSocket(4445) Création dun
DatagramSocket sur le port 4445 qui permet au
serveur de communiquer avec tous ses 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)
10
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)
11
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()
12
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


13
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
14
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)
15
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)
16
Communication par diffusion Multicast
Client1
Serveur
Gr
Client2
Clientn
17
Ouvrir un socket demander à se Connecter
Les clients demandent seulement à joindre un
groupe
18
Exemple de multicast
Un serveur de citation qui envoie une citation
toutes les minutes à tous les clients qui
écoutent (multicast)
19
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
20
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
21
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)
22
Multicast MulticastSocket
Type de socket utilisé côté client pour écouter
des paquets que le serveur  broadcast  à
plusieurs clients. . Une extension du
QuoteServer broadcaste à intervalle régulier
à tous ses clients
23
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()
24
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".
25
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.
26
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()

27
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
28
Quelques Informations utiles sur la sérialisation
Java
29
Sérialisation-Desérialisation
  • Enregistrer ou récupérer des objets dans un flux
  • Persistance
  • Transfert sur le réseau

30
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 objet
  • Un objet est sauvé quune fois cache pour les
    listes circulaires

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

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

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

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

35
Gestion de la sé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

36
Un peu plus de réflexivité
Les ClassLoader ????
37
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)
38
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).
39
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.
40
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
41
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
42
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.
43
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èmes de bufferisation liés
    aux E/S
  • Charsets qui associent des  décodeurs  et des
     encodeurs qui gèrent correctement les
    conversions chaines octets
  • Éliminent les problème daccent (caractères
    Unicode / UTF),

44
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

45
Le package Channel
  • SelectableChannel canal qui peut être
    multiplexé 
  • DatagramChannel Un canal dédié aux
    communications UDP prises en charge par des
    sockets de type java.net.DatagramSocket  
  • ServerSocketChannel   Un canal dédié aux
    connexions TCP prises en charge par des sockets
    de type java.net.ServerSocket  
  • SocketChannel Un canal dédié aux communications
    TCP prises en charge par des sockets de type
    java.net.Socket

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

47
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.
  • un canal est créé par appel à une méthode
    statique open définie dans chaque classe.
  • La socket est créée par effet de bord.

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

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

50
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

51
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()

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

53
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 .
Write a Comment
User Comments (0)
About PowerShow.com