Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parTristram Garin Modifié depuis plus de 10 années
1
À travailler seuls Concepts généraux Mise en œuvre Java Année 2011-2012
2
Programmation Réseaux Sockets Java Introduction aux applications réparties Couches Réseaux : protocoles TCP – UDP Sockets C Programmation par Composants Expériences Industrielles Administration et sécurité des réseaux Réseaux sans fil Applications Temps Réel
3
Protocoles de transport TCP et UDP ? Utilisation des adresses Internet ? Utilisation des ports ? Programmation sockets : gestion dentrées/sorties Client : ? Serveur : ? Serveur de noms ? (DNS, LDAP) ?
4
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 ?
5
Client : entité qui fait lappel Sockets : moyen de communication entre ordinateurs Adresses IP : adresse dun ordinateur Serveur : entité qui prend en charge la requête Serveur de noms (DNS) : correspondances entre noms logiques et adresses IP (Annuaire) Port : canal dédié à un service Protocole : langage utilisé par 2 ordinateurs pour communiquer entre eux protocole de transport : comment véhiculer les données – construction de la trame réseau protocole dapplication : comment le client et le serveur structurent les données échangées
6
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 En savoir plus ?
7
TCP Serveur FTP : 21 Serveur Telnet : 23 Serveur SMTP : 25 UDP Agent SNMP : 161 Logger SNMP : 162 Serveur rwhod : 513 Serveur multi processusApplications transactionnelles 1 à 1024 services fondamentaux (administrateurs) 1025 à 5000 disponibles pour les utilisateurs
8
Résultats dune recherche dans un DNS 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
9
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 : 20 ……. En savoir plus ?
10
ipconfig sous Windows ifconfig sous linux Exemple du modem ADSL (Freebox, LiveBox, etc.),modem ADSL deux interfaces réseau : une interface privée, servant à mettre en réseau les ordinateurs connectés à la Freebox. Adresse IP du type 192.168.0.* ou 192.168.1.*. A lécole adresses privées respectant le protocole ipV4 En savoir plus ?
11
Mode de communication quun hôte établit avec un autre hôte qui fournit un service quelconque application opération Client Serveur send request send reply « protocole dapplication » marshalling
12
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 au dessus dun protocole de transport
13
Deux types de transports via les socket API: Datagramme (non reliable) Orienté flux doctets (reliable) Une porte à travers laquelle lapplication peut à la fois envoyer et recevoir des messages dune autre application socket Comment construire des applications client/server qui communiquent via les sockets
14
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
15
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)
16
Plusieurs types de sockets : pour la communication par flot de données TCP - fortement connectée - synchrone - type client-serveur pour communication réseau par message UDP - en mode datagramme - en mode déconnecté pour communication réseau par diffusion UDP
17
Un serveur dEcho Un exemple : le service SMTP Demande de citations Diffusion de citations
18
Au dessus de TCP ou UDP En Java toutes les classes relatives aux sockets sont dans le package java.net Une infrastructure puissante et flexible pour la programmation réseau
19
Des Exceptions Des entrées Sorties Des Sockets …... Plusieurs hiérarchies de classes
20
ServerSocket DatagramSocket MulticastSocket Socket Object
21
Exception IOException SocketExceptionProtocolException UnknownHostExceptionUnknownServiceException BindException ConnectException
22
Object InputStream FileInputStream ObjectInputStream OutputStream FileOutputStream ObjectOutputStream FilterInputStream DataInputStream FilterOutputStream DataOutputStream
23
Object InetAdress DatagramPacketSocketImpl PlainSocketImpl
24
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) …..
26
application opération Client Serveur Ouvrir connexion req1 req2 req3 reqn Fermer la connexion TCP fournit un transfert fiable, conservant lordre de transfert des octets (pipe) entre le client et le serveur Point de vue application
27
Serveur (sexécutant sur lhôte) Client wait for incoming connection request connectionSocket = welcomeSocket.accept() create socket, port= x, for incoming request: welcomeSocket = ServerSocket() create socket, connect to hostid, port= x clientSocket = Socket() close connectionSocket read reply from clientSocket close clientSocket send request using clientSocket read request from connectionSocket write reply to connectionSocket TCP connection setup
28
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 Créer le socket de communication avec le client
29
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 Créer le socket de connexion avec le serveur Attendre que la connexion soit établie Récupérer la socket de communication
30
2 classes : Socket et ServerSocket (java.net package) pour les canaux de communication Classes pour le flot de données XInputStream et XOutputStream
32
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
33
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); }
34
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
35
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)
36
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)
37
Pour envoyer des informations au client Exemple dentrée sortie DataOutputStream : écrire des types de données primitifs; output= new DataOutputStream(clientSocket.getOutputStream());
38
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.getOutputStream();} catch (IOException e) {System.err.println(e);} …..
39
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
40
pour recevoir les données dun client DataInputStream input; try { input = new DataInputStream(clientSocket.getInputStream()); } catch (IOException e) {System.out.println(e);}
41
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);}
42
echoSocket = new Socket( "jessica", 7); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream())); 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.
43
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 ?
44
Fermer correctement les flux dentrée sortie et les sockets en cause. Côté client Côté serveur
45
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();
46
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 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
47
Un serveur similaire à echo ( port 7). Reçoit un texte du client et le renvoie identique Le serveur gère un seul client.
48
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); }
49
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);} } }
50
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é
51
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"); }
52
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: pinna@essi.fr \n"); os.writeBytes("Subject: Qui est là ?\n"); os.writeBytes("Vous suivez toujours ?\n"); // message os.writeBytes("\n.\n"); os.writeBytes("QUIT");
53
// 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);} } } }.
54
Quel est le protocole dapplication pour le service SMTP ? peut-on le changer ? Quel est lentrée du service sur la machine hôte ? peut-on la changer ? Quelle est le marshalling associé au protocole dapplication ? peut-on le changer ? Quel est le protocole de transport ? peut-on le changer ?
55
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...
56
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...
58
Serveur (sexécutant sur lhôte) Client wait for incoming connection request connectionSocket = welcomeSocket.accept() create socket, port= x, for incoming request: welcomeSocket = ServerSocket() create socket, connect to hostid, port= x clientSocket = Socket() close connectionSocket read reply from clientSocket close clientSocket send request using clientSocket read request from connectionSocket write reply to connectionSocket TCP connection setup
59
Utiliser des threads pour accepter plusieurs clients simultanément. Le serveur gère un thread par client
60
application Clientn Serveur Ouvrir connexion application Client1 application Client2 S1 S2 Sn
61
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 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émarrée. 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.
62
while (true) { accept a connection ; create a thread to deal with the client ; end while Scénario du Serveur Multithreadé
63
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(); } } }
64
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(); } }
66
application opération Client Serveur req1 rep1 reqn repn
67
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 application viewpoint 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
68
close clientSocket Serveur read reply from clientSocket create socket, clientSocket = DatagramSocket() Create, address ( hostid, port=x, send datagram request using clientSocket create socket, port= x, for incoming request: serverSocket = DatagramSocket() read request from serverSocket write reply to serverSocket specifying client host address, port umber Client
69
2 classes : DatagramPacket et DatagramSocket Datagramme = un message indépendant envoyé sur le réseau arrivée, temps darrivée et contenu non garantis packages dimplémentation de communication via UDP de datagrammes
70
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
71
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.
72
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-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)
73
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 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);
74
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 ->contenu 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();
75
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; }
76
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 laffiche
77
Quel est le protocole dapplication pour le service de citation ? peut-on le changer ? Quel est lentrée du service sur la machine hôte ? peut-on la changer ? Quelle est le marshalling associé au protocole dapplication ? peut-on le changer ? Quel est le protocole de transport ? peut-on le changer ?
78
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)
79
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…)
81
Service TCP : connection-oriented: setup required between client, server reliable transport between sending and receiving process flow control : sender wont overwhelm receiver congestion control : throttle sender when network overloaded does not providing : timing, minimum bandwidth guarantees Service UDP : unreliable data transfer between sending and receiving process does not provide: connection setup, reliability, flow control, congestion control, timing, or bandwidth guarantee
82
Time Sensitive no yes, 100s msec yes, few secs yes, 100s msec yes and no Application file transfer e-mail Web documents real-time audio/video stored audio/video interactive games financial apps Data loss no loss loss-tolerant no loss Bandwidth elastic audio: 5Kb-1Mb video:10Kb-5Mb same as above few Kbps up elastic
83
Application e-mail remote terminal access Web file transfer streaming multimedia remote file server Internet telephony Application layer protocol smtp [RFC 821] telnet [RFC 854] http [RFC 2068] ftp [RFC 959] proprietary (e.g. RealNetworks) NSF proprietary (e.g., Vocaltec) Underlying transport protocol TCP TCP or UDP typically UDP
84
Clientn Serveur Client1 Client2 Gr
85
Les clients demandent seulement à joindre un groupe
86
Un serveur de citation qui envoie une citation toutes les minutes à tous les clients qui écoutent (multicast)
87
Créer un paquet de sortie Préparer et Envoyer une donnée Fermer le socket dentrée Créer le socket dentrée
88
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 Créer le socket dentrée
89
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)
90
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
91
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();}
92
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".
93
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.
94
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();
95
ClientServeur TCPaSocketaServerSocket connectéwriteread readwrite UDPaDatagramSocketaDatagramSocket non connecté sendreceive receivesend MulticastaMulticastSocketaDatagramSocket/ aMulticastSocket receivesend I/O Stream aDatagramPacket
97
Enregistrer ou récupérer des objets dans un flux Persistance Transfert sur le réseau
98
Via la méthode writeObject() Classe implémentant linterface OutputObject Exemple : la classe OutputObjectStream Sérialisation dun objet -> sérialisation de tous les objets contenus par cet objet Un objet est sauvé quune fois : cache pour les listes circulaires
99
Via la méthode readObject() Classe implémentant linterface InputObject Exemple : la classe InputObjectStream
100
Si la classe de lobjet sauvé Nétend ni linterface Java Serializable Ni linterface Java Externalizable
101
Ne contient pas de méthode -> 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é
102
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)
103
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
104
Les ClassLoader ????
105
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)
106
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).
107
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.
108
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
109
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
110
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.
111
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),
112
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
113
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
114
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)
115
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.
116
import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; import java.util.*; import java.util.regex.*;
117
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);
118
// 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; }
119
// 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(); } }
120
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); } }
121
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 ….
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.