Programmation Réseaux Illustration : Les Sockets en Java
description
Transcript of Programmation Réseaux Illustration : Les Sockets en Java
Programmation RéseauxIllustration : Les Sockets en Java
Anne-Marie DéryÀ travailler seuls
Concepts généraux
Mise en œuvre Java
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
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
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.
Un « nouveau » Package : java.nio
• Les principales nouveautés de cette API sont : • Buffers : qui explicitent la notion de buffers –
containers de données– Améliorent les problème de bufferisation liées aux E/S
• Charsets : qui associent des « décodeurs » et des « encodeurs » qui gèrent correctement les conversions chaines – octets– Éliminent les problème de accent (caractères Unicode /
UTF),
Un « nouveau » Package : java.nio
• Channels : qui représentent des connexions entre entités avec de meilleures performances pour les opérations de lecture et d’écriture
• Selectors et selection keys : associées aux selectable channels définissent des E/S multiplexées non bloquantes – évitent les threads
Le package Channel
• SelectableChannel : canal qui peut être multiplexé • DatagramChannel Un canal dédié aux communication
UDP prises en charge par des sockets de type java.net.DatagramSocket
• ServerSocketChannel : Un canal dédié aux connexion TCP prises en charge par des sockets de type java.net.ServerSocket
• SocketChannel : Un canal dédié aux communication TCP prises en charge par des sockets de type java.net.Socket
Le package Channel
Et aussi…
Selector Un multiplexeur pour des SelectableChannel
SelectionKey représentant un canal étiqueté pour le multiplexage
Pipe Deux canaux pour construire un pipe unidirectionnel (| shell)
Les nouvelles sockets
• Ce package définit des classes de canaux qui sont utilisables par les classes de sockets :– DatagramSocket,
– ServerSocket, et Socket de java.net package.
– In all cases, un canal est créé par appel à une méthode statique open définie dans chaque classe.
– La socket est créée par egget de bord.
Exemple : Serveur d’heure
• import java.io.*;
• import java.net.*;
• import java.nio.*;
• import java.nio.channels.*;
• import java.nio.charset.*;
• import java.util.*;
• import java.util.regex.*;
Exemple : initialisations
public class TimeServer { private static int PORT = 8013; private static int port = PORT;
// Charset and encoder for US-ASCII private static Charset charset = Charset.forName("US-
ASCII"); private static CharsetEncoder encoder =
charset.newEncoder(); // Direct byte buffer for writing private static ByteBuffer dbuf =
ByteBuffer.allocateDirect(1024);
Exemple : attente de connexion sur le port du service
// Open and bind the server-socket channel
private static ServerSocketChannel setup() throws IOException
{ ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress isa = new InetSocketAddress(InetAddress.getLocalHost(),
port); ssc.socket().bind(isa); return ssc; }
Exemple : communication avec un client
// Service the next request to come in on the given channel // private static void serve(ServerSocketChannel ssc) throws
IOException { SocketChannel sc = ssc.accept(); try { String now = new Date().toString();
sc.write(encoder.encode(CharBuffer.wrap(now + "\n"))); System.out.println(sc.socket().getInetAddress() + " : " + now);
sc.close(); } finally { // Make sure we close the channel (and hence the socket)
sc.close(); } }
Exemple : code du serveur
public static void main(String[] args) throws IOException {
if (args.length > 1) { System.err.println("Usage: java TimeServer [port]"); return;
} // If the first argument is a string of digits then we take that // to be the port number if ((args.length == 1) && Pattern.matches("[0-9]+",
args[0])) port = Integer.parseInt(args[0]); ServerSocketChannel ssc = setup(); for (;;) serve(ssc); } }
Conclusion
Une large bibliothèque pour traiter les sockets et différents types de communication entre Clients et Serveurs dans Java
Une extension naturelle par abstraction à l’appel de méthodes à distance - Java RMI
et une normalisation Corba avec l’intégration d’un ORB(cf aaplications réparties 2nd semestre)
et maintenant les EJB : Entreprise Java Beans
Retour sur RMI
Exemple
CLIENT Essifun SERVEUR de Surnoms
oter
infrastructure
Protocole d’application ?
Communication client serveur
CLIENT SERVEUR
Préparation de la requêteEnvoi de la requêteAttente du résultat….
Analyse du résultat reçu
Connexion au serveur Attente de requêtes
Analyse de la requête…..Exécution….Préparation de la réponseEnvoi de la réponse
Exemple : annuaire des surnoms
EssiFun SERVEUR de Surnoms
enregistrer(« paul »,
«bug »)
marshalling
marshalling
unmarshalling
unmarshalling
0111000101000..
101..
enregistrer(« paul »,
«bug ») = TRUE
TRUE
1:Paul:bug ou ENR/nPaul/n/bug/n ou Objet Requête Seriablizable
Différence entre un transport TCP et UDP pour le codage des données ?
Que peut on automatiser ?
Au minimum, la phase de marshalling/unmarshalling(hétérogéneité des langages, des systèmes, etc)
Selon les cas, le squelette du serveur les appels distants du client
Exemple : annuaire des surnomset RMI
enregistrerlisteroter
AnnuaireEssi
listePersonnes
Enregistrer(AnneMarie,AM)lister()
Exemple : annuaire des surnoms
• interface : partie visible de l’objet (enregistrer, oter, lister, …)
• implémentation : partie privée inaccessible depuis d’autres objets (listePersonnes : un vecteur de Personne ou un tableau ou ….)
• interface = contrat entre l’objet et le monde extérieur (save impossible par exemple)
RMI
public interface Surnoms extends java.rmi.Remote{public Boolean enregistrer(String nom, String surnom) throws
java.rmi.RemoteException, ServeurSurnoms.surnoms.ExisteDeja ;
…. }
Générateurs
RMIC / Orbix...
IDL Int. JavaSpécificationsdes données
Générateurs
Fichiersgénérés Stubs Skeletons Proxy
(mise en œuvre de la sérialisationet désérialisation…)
RMI
Classes et Interfaces
ClasseLocale
Souche Squelette
ClasseDistante
InterfaceDistante
Remote
Appel méthode m() Appel méthode m()
Machine locale Machine distante
InterfaceDistante
Interaction Client Enregistreur
client serveur
client registreLookup : où est objetDistant ?
stub
Il est ici
Envoyez le stub
Le voicistub squelette
objetDistant
result = objetDistant.m()
result
RMIRegistry + ClassLoader
Exemple : annuaire des surnoms
XDR et RPC de SUN
Protocole := CHOICE { enregistrerReq [0] SEQUENCE{PrintableString nom,
PrintableString surnom} enregistrerRep[1] BOOLEAN, listerReq [2] NULL, listerRep [3] SET OF Personnes, ….}
Programme surnoms { version {
boolean enregistrer(nomSurnom) = 1; listePersonnes lister(void)=2 }= 1} = 10000
ASN.1 et norme ISO
Générateurs de Stubs
RPCGEN / MAVROS
ASN1 XDR
Librairie marshalling et unmarshalling
squelettes du client et du serveur
Spécificationsdes données
Générateurs
Types de donnéesC Lisp Java
Types de données
C
Fichiersgénérés
Les points communs des approches distribuées
Adressage : à tout serveur (objet ou programme)doit être affecté une référence unique
Transport : pour établir une communication entre 2 nœuds
et transmettre une requêteMarshalling :
transformation de la requête pour passer sur leréseau
Points communs
Protocol :transmission des requêtes entre exécutables
Dispatching :gestion des threads
Des services communsServices de nommageInterface repository.....
Restent à approfondir
Communication réseaux et Internet
Couches de transport
Différences entre UDP et TCP(Développement d’un serveur multicast Ack/NoAck pour gérer laperte des paquets UDP)
D’autres protocoles (RTP/RTCP)(introduction du routage multicast ou du tunelling)
Principes du IP / protocole ICMP
Service de nommage DNS Configuration services réseau
Introduction au Réseaux Locaux LANs Configuration carte réseau d’une machine,Développement d’un analyseur de trafic
et standards IEEE 802 : IEEE 802.3 et EthernetConfiguration d’un Firewall : IPTables,
Spécificités des Réseaux Locaux
Heureusement Dino est là :-)
Quelques interrogations ?
Comment choisir le bon middleware (intergiciel) ?Il y en a de plus en plus
Corba, RMI, DCOM, DSA + CCM, J2EE + Web Services, .net ....
Savoir les comparerIdentifier les points communsInteropérabilité : XML une solution suffisante ?
Heureusement Mireille est là