Programmation Réseaux Illustration : Les Sockets en Java
description
Transcript of Programmation Réseaux Illustration : Les Sockets en Java
![Page 1: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/1.jpg)
Programmation RéseauxIllustration : Les Sockets en Java
Anne-Marie DéryÀ travailler seuls
Concepts généraux
Mise en œuvre Java
![Page 2: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/2.jpg)
Communication asynchrone par messages
Communication par diffusion
![Page 3: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/3.jpg)
Communication par message : Envoi de datagrammes
applicationopération
Client
Serveur
req1rep1
reqnrepn
![Page 4: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/4.jpg)
Programmation Socket avec UDP
UDP: pas de “connexion” entre le client et le serveur
• Pas de lien privilégié entre le client et le serveur
• L’emetteur attache l’adresse IP et le port pour le retour.
• Le serveur doit extraire l’adresse IP et le port de l’expéditeur à partir du datagramme reçu
application viewpointUDP fournit un transfert
non fiable de groupes d’octets (“datagrammes”)
entre un client et le serveur
UDP: les données transmises peuvent être reçues dans le désordre ou perdues
![Page 5: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/5.jpg)
Client/server socket interaction: UDP
closeclientSocket
Serveur
read reply fromclientSocket
create socket,clientSocket = DatagramSocket()
Create, address (hostid, port=x,send datagram request using clientSocket
create socket,port=x, forincoming request:serverSocket = DatagramSocket()
read request fromserverSocket
write reply toserverSocketspecifying clienthost address,port umber
Client
![Page 6: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/6.jpg)
Datagrammes UDP et Sockets
2 classes : DatagramPacket et DatagramSocket
Datagramme = un message indépendant envoyé sur le réseau arrivée, temps d’arrivée et contenu non garantis
packages d’implémentation de communication via UDP de datagrammes
![Page 7: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/7.jpg)
Exemple
Un serveur de citation qui écoute un socket type datagram et envoie une citation si le client le demandeUn client qui fait simplement des requêtes au serveur
ATTENTION Plusieurs firewalls et routeurs sont configurés pour interdire le passage de paquets UDP
![Page 8: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/8.jpg)
Une Application Client Serveur
Le serveur reçoit en continu des paquets mode datagramme sur un socketun paquet reçu = une demande de citation d’un client le serveur envoie en réponse un paquet qui contient
une ligne "quote of the moment"
L’application cliente envoie simplement un paquetdatagramme au serveur indiquant qu’il souhaiterecevoir une citation et attend en réponse un paquetdu serveur.
![Page 9: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/9.jpg)
La classe QuoteServer
socket = new DatagramSocket(4445);Création d’un DatagramSocket sur le port 4445 qui permet au serveurde 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 contientune liste de citations ( une citation par ligne)
![Page 10: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/10.jpg)
suite
contient une boucle qui tant qu’il y a des citations dans le fichierattend l’arrivée d ’un DatagramPacket correspondant à une requête client sur un DatagramSocket.
Byte[] buf = new byte[256];DatagramPacket packet = new DatagramPacket(buf, buf.length);socket.receive(packet);
En réponse une citation est mise dans un DatagramPacket et envoyée sur 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);
![Page 11: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/11.jpg)
Suite
Adresse Internet + numéro de port (issus du DatagramPacket )= identification du client pour que le serveur puisse lui répondre
L’arrivée du DatagramPacket implique une requête ->contenu du buffer inutile
Le constructeur utilisé pour le DatagramPacket : un tableau d’octets contenant le message et la taille du tableau
+ L’adresse Internet et un no de port.
Lorsque le serveur a lu toutes les citationson ferme le socket de communication. socket.close();
![Page 12: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/12.jpg)
La classe QuoteClient
envoie une requête au QuoteServer, attend la réponse et affiche la réponse à l’écran.
Variables utilisées : int port; InetAddress address; DatagramSocket socket = null; DatagramPacket packet; byte[] sendBuf = new byte[256];Le client a besoin pour s ’exécuter du nom de la machine sur laquelle tourne le serveurif (args.length != 1) { System.out.println("Usage: java QuoteClient <hostname>"); return; }
![Page 13: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/13.jpg)
La partie principale du main
Création d ’un DatagramSocketDatagramSocket socket = new DatagramSocket();
Le constructeur lie le Socket à un port local libre Le programme envoie une requête au serveur
byte[] buf = new byte[256];InetAddress address = InetAddress.getByName(args[0]);DatagramPacket packet = new DatagramPacket(buf, buf.length,
address, 4445); socket.send(packet);
Ensuite le client récupère une réponse et l’affiche
![Page 14: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/14.jpg)
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 sedéconnecter, pour envoyer un paquet datagramme, pour un recevoir un paquet datagramme (connect, disconnect, send, receive)
![Page 15: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/15.jpg)
Classe DatagramPacket
Des constructeurs : buffer + longueur de buffer + adresse destination + port…
Des accesseurs en lecture : adresse à laquelle le paquet est envoyé, le no port à laquelle le paquet est envoyé, la donnée transmise (getAddress, getPort, getData, getLength…)
![Page 16: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/16.jpg)
Communication par diffusion : Multicast
Clientn
ServeurClient1
Client2
Gr
![Page 17: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/17.jpg)
Ouvrir un socket = demander à se Connecter
Les clients demandent seulement à joindre un groupe
![Page 18: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/18.jpg)
Exemple de multicast
Un serveur de citation qui envoie une citation toutes les minutes à tous les clients qui écoutent (multicast)
![Page 19: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/19.jpg)
Créer un paquet de sortiePréparer et Envoyer une donnée
Scénario d’un serveur
Fermer le socket d’entrée
Créer le socket d’entrée
![Page 20: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/20.jpg)
Scénario d’un client
Création d’un paquet d’entréeAttente de données en entréeRéception et traitement des données en entrée
Fermer le socket d ’entrée
Créer le socket d’entrée
![Page 21: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/21.jpg)
Classe MulticastServer
Des constructeurs : par défaut, port à utiliser
Des accesseurs en lecture : adresse du groupe (getInterface…)
Des méthodes : pour envoyer un paquet datagramme, pour joindre ou quitter un groupe (send, joinGroup, leaveGroup)
![Page 22: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/22.jpg)
Multicast: MulticastSocket
Type de socket utilisé côté client pour écouter des paquets quele serveur « broadcast » à plusieurs clients. .
Une extension du QuoteServer : broadcaste à intervalle régulier à tous ses clients
![Page 23: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/23.jpg)
Cœur du serveur
while (moreQuotes) { try { byte[] buf new byte[256]; // don't wait for request...just send a quote
String dString = null; if (in == null) dString = new Date().toString(); else dString = getNextQuote(); buf = dString.getBytes(); InetAddress group = InetAddress.getByName("230.0.0.1"); DatagramPacket packet; packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet);
try {sleep((long)Math.random() * FIVE_SECONDS); } catch (InterruptedException e) { } } catch (IOException e) { e.printStackTrace(); moreQuotes = false;} } socket.close();}
![Page 24: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/24.jpg)
Différences principales
Le DatagramPacket est construit à partir de de « l’adresse de plusieurs clients »
L ’adresse et le no de port sont câblés
no de port 4446 (tout client doit avoir un MulticastSocket lié à ce no). L’adresse InetAddress "230.0.0.1" correspond à un identificateur de groupe et non à une adresse Internet de la machine d’un client
Le DatagramPacket est destiné à tous les clients qui écoutent le port 4446 et qui sont membres du groupe "230.0.0.1".
![Page 25: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/25.jpg)
Un nouveau Client
Pour écouter le port 4446, le programme du client doit créer son MulticastSocket avec ce no. Pour être membre du groupe "230.0.0.1" le client adresse la méthode joinGroup du MulticastSocket avec l’adresse d’identification du groupe.
Le serveur utilise un DatagramSocket pour faire du broadcast à partirde données du client sur un MulticastSocket. Il aurait pu utiliser aussiun MulticastSocket. Le socket utilisé par le serveur pour envoyer leDatagramPacket n’est pas important. Ce qui est important pour lebroadcast est d’adresser l’information contenue dans le DatagramPacket, et le socket utilisé par le client pour l’écouter.
![Page 26: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/26.jpg)
MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName("230.0.0.1"); socket.joinGroup(group);
DatagramPacket packet; for (int i = 0; i < 5; i++) { byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); socket.receive(packet);
String received = new String(packet.getData()); System.out.println("Quote of the Moment: " + received); } socket.leaveGroup(group);
socket.close();
![Page 27: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/27.jpg)
Synthèse
Client Serveur
TCP aSocket aServerSocketconnecté write read
read write
UDP aDatagramSocket aDatagramSocketnon connecté send receive
receive send
Multicast aMulticastSocket aDatagramSocket/aMulticastSocket
receive send
I/O Stream I/O Stream
aDatagramPacket
![Page 28: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/28.jpg)
Quelques Informations utiles sur la sérialisation Java
![Page 29: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/29.jpg)
Sérialisation-Desérialisation
• Enregistrer ou récupérer des objets dans un flux– Persistance– Transfert sur le réseau
![Page 30: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/30.jpg)
Sérialisation
• Via la méthode writeObject()– Classe implémentant l’interface OutputObject
– Exemple : la classe OutputObjectStream
– Sérialisation d’un objet -> sérialisation de tous les objets contenus par cet objet
• Un objet est sauvé qu’une fois : cache pour les listes circulaires
![Page 31: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/31.jpg)
Desérialisation
• Via la méthode readObject()– Classe implémentant l’interface InputObject
– Exemple : la classe InputObjectStream
![Page 32: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/32.jpg)
Exception NotSerializableException
• Si la classe de l’objet sauvé– N’étend ni l’interface Java Serializable– Ni l’interface Java Externalizable
![Page 33: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/33.jpg)
Interface Serializable
• Ne contient pas de méthode
• -> enregistrement et récupération de toutes les variables d’instances (pas de static)+ informations sur sa classe (nom, version), type
et nom des variables • 2 classes compatibles peuvent être utilisées
•Objet récupéré = une copie de l’objet enregistré
![Page 34: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/34.jpg)
Gestion de la sérialisation desérialisation
• Implémenter les méthodes • private void writeObject(OutputObjectStream s) throws IOException• private void readObject(OutputInputStream s) throws IOException
• defaultReadObject() et defaultWriteObject() méthodes par défaut
• Ajout d’informations à l’enregistrement, choix de sérialisation
• Seulement pour les champs propres de la classe (héritage géré automatiquement)
![Page 35: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/35.jpg)
Gestion de la sérialisation : utiliser Externalizable
• Graphe d’héritage complet
• Implémenter les méthodes • public void writeExternal(ObjectOutput o) throws
IOException• public void readExternal(ObjectInput o) throws
IOException
– ATTENTION PBM de SECURITE
![Page 36: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/36.jpg)
Un peu plus de réflexivité
Les ClassLoader ????
![Page 37: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/37.jpg)
Classe ClassLoaderClassLoader est une classe abstraite. Un class loader est un objet responsable du chargement des classes Un nom de classe donné, il peut localiser ou générer les données quiconstituent une définition de la classe. Chaque objet Class a une référence à un ClassLoader qui le définit.
Applications implémentent des sous classes de ClassLoader afind’étendre la façon de dynamiquement charger des classes par la VM.(utilisation de manager de sécurité, par exemple)
![Page 38: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/38.jpg)
ClassLoader ?
En UNIX la VM charge les classes à partir des chemins définis dans CLASSPATH.
Certaines classes peuvent être obtenues à partir d’autres sources, telles que le réseau ou construites par une application. La méthode defineClass convertit un tableau d’octets en une instance de Class.Instances pouvant être créées grâce à newInstance
Les méthodes et constructeurs créés par un class loader peuvent référencer d’autres classes (loadClass du class loader de cette classe).
![Page 39: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/39.jpg)
Exemple de chargement de classe
Un class loader qui permet de charger des fichiers de classes via le réseau
ClassLoader loader=new NetworkClassLoader(host,port);Object main= loader.loadClass("Main", true).newInstance();….
NetworkClassLoader doit définir findClass et loadClassData pour charger et defineClass pour créer une instance de Class.
![Page 40: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/40.jpg)
Définir un nouveau type de socket
Pourquoi ?Préparer les données avant de les envoyerReconstruire les données reçues
ExempleJava RMI Sockets spécialisées (marshalling et unmarshalling)
Exemple Images : Compression et Décompression
Comment ?En spécialisant les classes de base
![Page 41: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/41.jpg)
Comment Définir un nouveau type de Sockets
La classe CompressionSocket et ses classes relatives4 étapes
Communication TCP Définir des E/S Spécifiques
1. Etendre java.io.FilterOutputStream pour créer un output stream pour ce type de Socket. Surcharge de méthodes si nécessaire.Le write doit compresser l’image avant d’écrire 2. Etendre java.io.FilterInputStream Le read doit décompresser après avoir lu
![Page 42: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/42.jpg)
Comment Définir un nouveau type de Sockets
La classe CompressionSocket et ses classes relatives4 étapes
3. Etendre java.net.Socket Implémenter les constructeurs appropriés et surchargergetInputStream, getOutputStream et close.
4. Etendre java.net.ServerSocket Implémenter le constructeur et surcharger acceptpour créer un socket du bon type.
![Page 43: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/43.jpg)
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 d’accent (caractères Unicode /
UTF),
![Page 44: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/44.jpg)
Un « nouveau » Package : java.nio
• Channels : qui représentent des connexions entre entités avec de meilleures performances pour les opérations de lecture et d’écriture
• Selectors et selection keys : associées aux selectable channels définissent des E/S multiplexées non bloquantes – évitent les threads
![Page 45: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/45.jpg)
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
![Page 46: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/46.jpg)
Le package Channel
Et aussi…
Selector Un multiplexeur pour des SelectableChannel
SelectionKey représentant un canal étiqueté pour le multiplexage
Pipe Deux canaux pour construire un pipe unidirectionnel (| shell)
![Page 47: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/47.jpg)
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.
![Page 48: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/48.jpg)
Exemple : Serveur d’heure
• import java.io.*;
• import java.net.*;
• import java.nio.*;
• import java.nio.channels.*;
• import java.nio.charset.*;
• import java.util.*;
• import java.util.regex.*;
![Page 49: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/49.jpg)
Exemple : initialisations
public class TimeServer { private static int PORT = 8013; private static int port = PORT;
// Charset and encoder for US-ASCII private static Charset charset = Charset.forName("US-
ASCII"); private static CharsetEncoder encoder =
charset.newEncoder(); // Direct byte buffer for writing private static ByteBuffer dbuf =
ByteBuffer.allocateDirect(1024);
![Page 50: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/50.jpg)
Exemple : attente de connexion sur le port du service
// Open and bind the server-socket channel
private static ServerSocketChannel setup() throws IOException
{ ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress isa = new InetSocketAddress(InetAddress.getLocalHost(),
port); ssc.socket().bind(isa); return ssc; }
![Page 51: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/51.jpg)
Exemple : communication avec un client
// Service the next request to come in on the given channel // private static void serve(ServerSocketChannel ssc) throws
IOException { SocketChannel sc = ssc.accept(); try { String now = new Date().toString();
sc.write(encoder.encode(CharBuffer.wrap(now + "\n"))); System.out.println(sc.socket().getInetAddress() + " : " + now);
sc.close(); } finally { // Make sure we close the channel (and hence the socket)
sc.close(); } }
![Page 52: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/52.jpg)
Exemple : code du serveur
public static void main(String[] args) throws IOException {
if (args.length > 1) { System.err.println("Usage: java TimeServer [port]"); return;
} // If the first argument is a string of digits then we take that // to be the port number if ((args.length == 1) && Pattern.matches("[0-9]+",
args[0])) port = Integer.parseInt(args[0]); ServerSocketChannel ssc = setup(); for (;;) serve(ssc); } }
![Page 53: Programmation Réseaux Illustration : Les Sockets en Java](https://reader035.fdocuments.net/reader035/viewer/2022062423/568143e8550346895db06ef7/html5/thumbnails/53.jpg)
Conclusion
Une large bibliothèque pour traiter les sockets et différents types de communication entre Clients et Serveurs dans Java
Une extension naturelle par abstraction à l’appel de méthodes à distance - Java RMI
et une normalisation Corba avec l’intégration d’un ORB
….