Professional Documents
Culture Documents
Didier Donsez
Universit de Valenciennes Institut des Sciences et Techniques de Valenciennes donsez@univ-valenciennes.fr
Adresses IP
InetAddress
n
Programmation Rseau en Java, D. Donsez, 1999-2000
Socket TCP
Socket, ServerSocket
Sockets UDP
DatagramSocket, DatagramPacket
Sockets MultiCast
MulticastSocket, DatagramPacket
La classe java.net.InetAddress
n n
Exemple
InetAddress server; try { if (args.length > 0) { server = InetAddress.getByName(args[0]); } else { server = InetAddress.getLocalHost(); } System.out.println(server); // affiche le nom du server } catch (UnknownHostException e) { System.out.println("Could not find this computer's address."); }
,3
,4
Reprsente une connexion fiable TCP/IP entre 2 processus (qui peuvent ne tre des JVM !)
la connexion est fiable (contrle d erreur, ) et 2 flots de donnes sont tablis entre les deux machines
Terminologie
La connexion est dite en mode connect
,5
JVM JVMTCPServer TCPServer main thread Cration d un ServerSocket Attente d une demande de connexion accept()
Cration d un Socket
Rcupration des flots d entre et de sortie getInputStream() et getOutputStream() Rcupration des flots d entre et de sortie getInputStream() et getOutputStream()
Echange de donnes avec le serveur suivant un protocole applicatif (couche 7) read(), write(), flush() Fermeture de la connexion close()
Echange de donnes avec le client suivant un protocole applicatif (couche 7) read(), write(), flush()
Fermeture de la connexion close() Terminaison de la JVM Attente d une autre demande de connexion d un autre client accept()
,7
Socket TCP
Remarques lors du droulement de l excution
n
Le serveur
Aprs la fermeture de la connexion, le serveur se met en attente du nouvelle connexion du mme client ou d un autre Si plusieurs demandes connexions arrivent simultanment, une seule est accepte et les autres sont mises en attente jusqu au accept() suivant (modulo les timeouts)
pour accepter et traiter plusieurs connexions simultanes, la solution est de multithread le serveur
Le protocole
Le client et le serveur doivent respecter un protocole valide d change des donnes selon un automate.
le client envoie un entier mais le serveur attend un flottant le client attend des donnes du serveur qui lui mme attend des donnes du client
il y a interblocage
Exemple de protocole en mode ligne : HTTP, FTP, SMTP, Avantage pour le deboggage : le client peut tre un client telnet
telnet www 80, telnet mailhost 25
Programmation Rseau en Java, D. Donsez, 1999-2000
Exemples : RPC, RMI, CORBA, ... Le bloc peut avoir un entte qui contient un code d opration et la longueur du corps du bloc qui contient les donnes
,9
, 11
Remarque :
l API JavaMail est prfrable pour l envoi des courriers !
, 13
}}
Les exceptions
n
java.net.BindException
erreur de liaison une adresse locale (le port est peut tre dj li)
n
java.net.ConnectException
java.net.NoRouteToHostException
java.net.ProtocolException
java.net.SocketException
java.net.UnknownHostException
erreur de DNS
, 16
Serveur Multithread
n
Motivation
Accepter (et servir) plusieurs connexions simultanes de plusieurs clients
n
Programmation Rseau en Java, D. Donsez, 1999-2000
Mthode
une thread (dite dispatcher) attend les demandes de connexions rcupre un socket ddi cette connexion avec client cre une thread (dite de service) qui prend en charge le dialogue avec le client et retourne en attente d une nouvelle demande de connexion
Remarque
les threads de service peuvent tre retires d un pool
avantage : limiter le cot d initialisation des threads de service
une thread sert plusieurs requtes successives de clients diffrents
, 17
Socket TCP
Droulement de l excution multithreade
hostcli hostcli hostser hostser
dispatcher JVM JVMTCPServer TCPServer thread Cration d un ServerSocket Attente d une demande de connexion accept() service thread
Cration et dmarrage de la thread de service ou rcupration d une thread dans le pool
Cration d un Socket
Rcupration des flots d entre et de sortie getInputStream() et getOutputStream()
Echange de donnes avec le serveur suivant un protocole applicatif (couche 7) read(), write(), flush() Fermeture de la connexion close()
Echange de donnes avec le client suivant un protocole applicatif (couche 7) read(), write(), flush()
Terminaison de la JVM
, 19
Motivation
il est souvent ncessaire de traiter les donnes envoyer ou reues d un java.net.Socket (compression, conversion, filtrage, chiffrage, )
Post-traitement des donnes aprs rception (ex: Dcompression, Dchiffrage) Pr-traitement des donnes avant envoi (ex: Compression, Chiffrage)
2 Mthodes
Soient deux classes tendant java.io.FilterOutputStream et java.io.FilterInputStream CompressionOutputStream et CompressionInputStream Mthode 1:
Socket sock = new Socket(...); InputStream in = new CompressionInputStream(sock.getInputStream()); OutputStream out = new CompressionOutputStream(sock.getOutputStream(), compressRate);
, 20
, 21
, 23
Didier Donsez
Universit de Valenciennes Institut des Sciences et Techniques de Valenciennes donsez@univ-valenciennes.fr
Principe
l envoyeur (sender) envoie un datagramme (paquets de donnes sur un socket que le receveur (receiver) coute. n La classe java.net.DatagramSocket Reprsente le socket local ou distant en mode non connect n La classe java.net.DatagramPacket Reprsente un packet (ou Datagramme) envoyer ou reu
, 27
Cot metteur
cre le DatagramSocket
DatagramSocket ms = new DatagramSocket(receiverInetAddress);
construit un DatagramPacket
byte[] data = new byte[len]; // data doit tre rempli : data = {'H', 'e', 'l', 'l', 'o'}; DatagramPacket outputPacket = new DatagramPacket(data, data.length, receiverInetAddress, port);
Programmation Rseau en Java, D. Donsez, 1999-2000
Cot rcepteur
cre le DatagramSocket li un port d coute
DatagramSocket theSocket = new DatagramSocket(port);
JVM JVMUDPSender UDPSender main thread Cration d un DatagramSocket Cration du DatagramPacket 1 Envoi du DatagramPacket 1
Programmation Rseau en Java, D. Donsez, 1999-2000
JVM JVMUDPReceiver UDPReceiver main thread Cration d un DatagramSocket Cration d un DatagramPacket Dbut d attente de rception d un DatagramPacket Rception d un DatagramPacket 1
Cration du DatagramPacket 2 Envoi du DatagramPacket 2 Cration du DatagramPacket 3 Envoi du DatagramPacket 3 Cration du DatagramPacket 4 Envoi du DatagramPacket 4 Cration du DatagramPacket 5 Envoi du DatagramPacket 5 L metteur ne le sait pas Terminaison de la JVM
Remarques
n
Lecture
les 3 tomes de Raynal
, 32
La classe java.net.DatagramPacket
Reprsente un packet (ou Datagramme) envoyer ou reu par UDP ou IP MultiCast
Contient un tableau de byte
qui peut tre rcuprer ou positionner avec les mthodes getData()/setData(), setLength()/getLength()
la structure peut contenir un numro de squence, horloge de Mattern, pour assurer un niveau de fiabilit peut contenir un objet srialis (ou externalis)
uniquement si l metteur et le rcepteur sont des JVMs.
, 33
Didier Donsez
Universit de Valenciennes Institut des Sciences et Techniques de Valenciennes donsez@univ-valenciennes.fr
voir http://www.univ-valenciennes.fr/CRU/OR/
Groupe MultiCast
spcifi par une adresse de classe D (de 224.0.0.1 239.255.255.255) et par un port (UDP)
, 35
Principe
le diffuseur (multicaster) rejoint un groupe multicast et envoie un datagramme sur ce groupe les rcepteurs (receiver) qui ont rejoint le groupe reoivent les datagrammes envoys par les diffuseurs.
La classe java.net.MulticastSocket
drive de java.net.DatagramSocket Reprsente le socket en diffusion
La classe java.net.DatagramPacket
Reprsente un packet (ou Datagramme) envoyer ou reu
, 36
Cot diffuseur
cre le MulticastSocket
MulticastSocket ms = new MulticastSocket(); ms.joinGroup(groupInetAddress);
Cot rcepteur
cre le MulticastSocket et rejoindre le groupe
MulticastSocket ms = new MulticastSocket(port); ms.joinGroup(groupInetAddress);
, 38
InetAddress ia = InetAddress.getByName(args[0]); // adresse de classe D int port = Integer.parseInt(args[1]); MulticastSocket ms = new MulticastSocket(port); ms.joinGroup(ia); while (true) { ms.receive(dp); String s = new String(dp.getData(), 0, 0, dp.getLength()); System.out.println(s); } } catch (Exception e) { System.err.println(e); } }}
, 39
Les applets ne sont pas autorises utiliser les sockets multicast Quand un message est envoy, tous les membres d un groupe reoivent le message dans l intervalle du TTL (time-to-live)
, 40
R R2
R R2
R
, 41
Didier Donsez
Universit de Valenciennes Institut des Sciences et Techniques de Valenciennes donsez@univ-valenciennes.fr
java.net.URL
n n
Dfinit une URL Mthodes String getProtocol(), String getHost(), String getPort(), String getRef()
InputStream openStream()
URLConnection openConnection()
Constructeurs
URL localfile = new URL("/users/donsez/pages/cours/index.html"); URL gamelan = new URL("http://www.gamelan.com/pages/"); URL gamelanGames = new URL(gamelan, "Gamelan.game.html"); URL gamelanNetwork = new URL(gamelan, "Gamelan.net.html"); URL gamelanNetworkBottom = new URL(gamelanNetwork, "#BOTTOM"); URL gamelanNetwork2 = new URL("http", "www.gamelan.com", "/pages/Gamelan.net.html");
, 44
java.net.URL Mthodes
n
import java.net.*; import java.io.*; public class ParseURL { public static void main(String[] args) throws Exception { URL aURL = new URL("http://java.sun.com:80/docs/books/" + "tutorial/index.html#DOWNLOADING"); System.out.println("protocol = " + aURL.getProtocol()); System.out.println("host = " + aURL.getHost()+ " filename = " + aURL.getFile()); System.out.println("port = " + aURL.getPort() + " ref = " + aURL.getRef()); } }
Utilitaires
static String URLDecoder.decode(String urlencoded) static String URLEncoder.encode(String str) mthodes statiques de conversion x-www-form-urlencoded vers/depuis String
, 45
Sous-classes
HttpURLConnection, JarURLConnection
, 47
java.net.URLConnection
n
Utilisation
1- l instance est rcupr de URL.openConnection() 2- configuration des paramtres de la connexion
setAllowUserInteraction, setDoInput, setDoOutput, setIfModifiedSince, setUseCaches, setRequestProperty
3- connexion connect() et obtention d un InputStream 4- rcupration des champs d entte (header fields)
getContent, getHeaderField, getContentEncoding, getContentLength, getContentType, getDate, getExpiration, getLastModifed
, 48
Exercice :
crire un robot qui rcupre une hirarchie de documents HTML partir d une URL
, 49
, 50
java.net.HttpURLConnection
n
Mthodes
Positionnement des champs de la requte HTTP
setRequestedMethod()
, 51
java.net.JarURLConnection
n
!/ est un sparateur
un Jar file : jar:http://www.foo.com/bar/baz.jar!/ un Jar file : jar:file:/local/dev/bar/baz.jar!/ un rpertoire : jar:http://www.foo.com/bar/baz.jar!/COM/foo/ un entre : jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
Exemple
url = new URL("jar:http://www.foo.com/bar/baz.jar!/"); JarURLConnection jarConnection=(JarURLConnection)url.openConnection(); Manifest manifest = jarConnection.getManifest();
, 53
3 classes d objets
Gestionnaire de schma
sous-classe de URLStreamHandler par dfaut sun.net.www.protocol.<schema>.Handler
Gestionnaire de connexion
sous-classe de URLConnection
, 55
Conclusion
n
n
Programmation Rseau en Java, D. Donsez, 1999-2000
Cependant
les messages et flux de donnes ne sont pas structurs
Gnralits
Guy Pujolle, "Les rseaux", Ed Eyrolles , 3me d., 2000, ISBN 2-212-09119-2
Chapitres 12 et 16 : IP dans les grandes lignes mise jour rgulire
Dtail
W.R. Stevens, TCP/IP Rgles et Protocoles Volume 1,2 et 3, Ed Vuibert (AddisonWesley pour la VA de 1994), 1998, ISBN 2-7117-8639-0
Douglas E. Comer, Internetworking with TCP/IP volume I , Prentice Hall Douglas E. Comer & David L. Stevens, Internetworking with TCP/IP volume II (Implementation and Design Issues) , Prentice Hall Douglas E. Comer & David L. Stevens, Internetworking with TCP/IP volume III (Client / Server Programming & Apps.) , Prentice Hall
n
Liens
http://www.yahoo.com/Computers/Software/Protocols/IP/
, 58
Bibliographie
Programmation des Sockets
n
Voir le cours Socket sous Unix Gilles Roussel, tienne Duris, "Java et Internet, Concepts et programmation", Ed Vuibert, 01/2000, ISBN : 2-7117-8654-4
dtaille bien la programmation TCP, UDP et MultiCast en Java
n
Programmation Rseau en Java, D. Donsez, 1999-2000
Elliotte Rusty Harold, Programmation Rseau avec Java , Ed O Reilly, 1997, ISBN 2-84177-034-6 Scott Oaks, Henry Wong, "Java Threads", 2nd Edition,Ed Oreilly, 1999, 156592-418-5, existe en franais
voir Chapitre 5 pour les serveurs multithreads
n n
David Flanagan, Java in a Nutshell , Oreilly E.R Harold, "Java I/O", Ed Oreilly, 1999, 1-56592-485-1
voir Chapitre 5 pour l utilisation de Input/Output streams
Robert Orfali, Dan Harkey, Client/Server Programming with Java and Corba , 2me dition, 1998, Ed Wiley, ISBN 0-471-24578-X.
voir le chapitre 10 qui compare les Sockets CORBA
, 59