Programmation Reseau en Java
Programmation Reseau en Java
net/publication/267714194
Programmation Réseau en Java
Article
CITATIONS READS
0 234
1 author:
Didier Donsez
Université Grenoble Alpes
98 PUBLICATIONS 606 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
Anthony Gelibert Master Thesis View project
Rapid-2 project View project
All content following this page was uploaded by Didier Donsez on 04 May 2016.
The user has requested enhancement of the downloaded file.
http://www-adele.imag.fr/users/Didier.Donsez/cours
Programmation Réseau
en Java
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – LSR/ADELE
Didier.Donsez@imag.fr, Didier.Donsez@ieee.org
10/08/2006
2
Les API Réseau de Java
java.net et javax.net
• Classes et interfaces du paquetage java.net, javax.net
Adresses IP
InetAddress
Socket TCP
Socket, ServerSocket, JSSE (Java Secure Socket Layer)
Sockets UDP
D. Donsez, 1999-2006, Programmation Réseau en Java
DatagramSocket, DatagramPacket
Sockets MultiCast
MulticastSocket, DatagramPacket
Classes réseau niveau application (couche 7)
URL, URI, URLConnection, HttpURLConnection, JarURLConnection
10/08/2006
3
La classe java.net.InetAddress
• 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."); }
10/08/2006
4
Exemple d ’après [Rusty - chapitre 4]
avec java.net.InetAddress
package java.net; import java.util.StringTokenizer;
public class InetAddressFactory { // d ’après [Rusty - chapitre 4]
// Use a byte array like {199, 1, 32, 90} to build an InetAddressObject
public static InetAddress newInetAddress(byte addr[]) throws UnknownHostException {
try { InetAddress ia = new InetAddress();
ia.address = (addr[3] & 0xFF) | ((addr[2] << 8) & 0xFF00);
| ((addr[1] << 16) & 0xFF0000) | ((addr[0] << 24) & 0xFF000000);
return ia;
} catch (Exception e) { throw new UnknownHostException(e.toString()); }
D. Donsez, 1999-2006, Programmation Réseau en Java
}
// Use a String like 199.1.32.90 to build an InetAddressObject
public static InetAddress newInetAddress(String s) throws UnknownHostException {
int num_bytes_in_an_IPv4_address = 4; byte addr[] = new byte[num_bytes_in_an_ IPv4_address];
StringTokenizer st = new StringTokenizer(s, ".");
if (st.countTokens() != addr.length) { throw new UnknownHostException(s + " is not a valid IP address"); }
for (int i = 0; i < addr.length; i++) {
int thisByte = Integer.parseInt(st.nextToken());
if (thisByte < 0 || thisByte > 255) { throw new UnknownHostException(s + " is not a valid IP address"); }
if (thisByte > 127) thisByte -= 256; addr[i] = (byte) thisByte;
} return newInetAddress(addr); } }
10/08/2006
5
Remarque
• Ces solutions sont applicables
D. Donsez, 1999-2006, Programmation Réseau en Java
ServerSocket listenSocket;
try {
listenSocket = new ServerSocket(Integer.parseInt(args[0])); // port
while(true) {
Socket clientSocket = listenSocket.accept();
System.err.println("Connexion from:" + clientSocket.getInetAddress());
doService(clientSocket);
} catch (Exception e) { System.err.println(e); }
}
}
10/08/2006
16
Exemple d ’un Code d ’un Client SMTP
(i)
// java SMTPMailer yourmailhost yourmaildomain yourcorrespondentdaddress youraddress Hi "Hello You"
import java.io.*;
import java.net.*;
public class SMTPMailer{
static final String CFLF="\r\n";
static final int SMTP_PORT=25;
public static void main(String args[])
try{
Socket sock = new Socket(arvs[0], SMTP_PORT);
DataInputStream in = new DataInputStream(sock.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
D. Donsez, 1999-2006, Programmation Réseau en Java
socket.close();
} catch(IOException ioe) {
System.out.println("Erreur de connection : " + ioe.getMessage());
}
}…
Remarque :
• l ’API JavaMail est préférable pour l ’envoi des courriers !
10/08/2006
17
Exemple d ’un Code d ’un Client SMTP
(ii)
static void SMTP(
BufferedReader br, DataOutputStream out,
String MAILDOMAIN, String FROM, String TO, String SUBJECT, String MSG){
String cmdstr, statusline;
statusline = br.readLine(); System.out.print(statusline); // le serveur se présente
cmdstr="HELO " + MAILDOMAIN + CRLF; // EHLO pour les ordres étendus
out.writeBytes(cmdstr); out.flush(); System.out.print(cmdstr);
statusline = br.readLine(); System.out.println(statusline);
cmdstr ="MAIL FROM:"+ FROM + CRLF;
out.writeBytes(cmdstr); out.flush(); System.out.print(cmdstr);
cmdstr ="RCPT TO:" + TO + CRLF;
out.writeBytes(cmdstr); out.flush(); System.out.print(cmdstr);
D. Donsez, 1999-2006, Programmation Réseau en Java
Les exceptions
java.net.BindException
• erreur de liaison à une adresse locale (le port est peut être déjà
lié)
java.net.ConnectException
• refus de connexion par l ’hôte (pas de process qui écoute le
port, …)
java.net.NoRouteToHostException
D. Donsez, 1999-2006, Programmation Réseau en Java
Serveur Multithreadé
Motivation
• Accepter (et servir) plusieurs connexions simultanées
de plusieurs clients
Méthode
• une thread (dite dispatcher) attend les demandes de connexions
• récupère un socket dédié à cette connexion avec client
• crée une thread (dite de service)
D. Donsez, 1999-2006, Programmation Réseau en Java
Motivation
• il est souvent nécessaire de traiter les données à envoyer ou reçues d ’un
java.net.Socket (compression, conversion, filtrage, chiffrage, …)
• Post-traitement des données après réception (ex: Décompression, Déchiffrage)
• Pré-traitement des données avant envoi (ex: Compression, Chiffrage)
2 Méthodes
• Soient deux classes étendant java.io.FilterOutputStream et java.io.FilterInputStream
D. Donsez, 1999-2006, Programmation Réseau en Java
• CompressionOutputStream et CompressionInputStream
• Méthode 1:
Socket sock = new Socket(...);
InputStream in = new CompressionInputStream(sock.getInputStream());
OutputStream out = new CompressionOutputStream(sock.getOutputStream(), compressRate);
• Méthode 2: Encapsulation par héritage
10/08/2006
26
CompressionSocket et CompressionSocketServer
Remarque
• Utilisé par les RMI pour personnaliser la couche Transport
au moyen de RMIClientSocketFactory/RMIClientSocketFactory
• voir jdk1.2.2\docs\guide\rmi\sockettype.doc.html
10/08/2006
27
Personnaliser un type de Socket
Sous classe de Socket
import java.io.*; import java.net.*;
class CompressionSocket extends Socket {
private int compressionrate;
private InputStream in;
private OutputStream out;
public CompressionSocket(int compressionrate) {
super(); this.compressionrate=compressionrate;
}
public CompressionSocket(String host, int port, int compressionrate) throws IOException {
super(host, port); this.compressionrate=compressionrate; }
D. Donsez, 1999-2006, Programmation Réseau en Java
implAccept(s);
return s;
}
}
10/08/2006
29
Gestionnaire de sécurité
Exemple
grant {
permission java.net.SocketPermission "localhost:3003", "listen";
permission java.net.SocketPermission "serveur", "connect,accept";
permission java.net.SocketPermission "*.uvhc.fr:1000-2000", "connect";
permission java.net.SocketPermission "*.uvhc.fr:3000-", "connect";
}
D. Donsez, 1999-2006, Programmation Réseau en Java
Remarque
• pas de distinction entre UDP et TCP
10/08/2006
30
Relai SOCKS
Propriétés
• socksProxyHost, socksProxyPort
• Voir la documentation
%J2SE14_HOME%\docs\guide\security\jsse\JSSERefGuide.html
• SSLContext est initialisée avec un KeyManager
• SSLSocketFactory et SSLServerSocketFactory sont créés avec
SSLContext
• SSLServerSocket est créé par SSLServerSocketFactory
• SSLSocket est créé par SSLSocketFactory ou SSLServerSocket
10/08/2006
32
s.startHandshake();
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
// Send messages to the server through the OutputStream
// Receive messages from the server through the InputStream
}
catch (IOException e) {
}
10/08/2006
33
SSLSocket c = (SSLSocket)s.accept();
OutputStream out = c.getOutputStream();
InputStream in = c.getInputStream();
// Send messages to the client through the OutputStream
// Receive messages from the client through the InputStream
}
catch (IOException e) {
}
10/08/2006
34
JSSE Exemple de client
avec authentification
...
SSLSocketFactory factory = null;
try { // VOIR COURS JCE
char[] passphrase = "passphrase".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("testkeys"), passphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passphrase);
D. Donsez, 1999-2006, Programmation Réseau en Java
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
Didier.Donsez@imag.fr
10/08/2006
36
Envoi du DatagramPacket 3
(paquet 2 perdu) DatagramPacket
Remarques
La classe java.net.DatagramPacket
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
Didier.Donsez@imag.fr
10/08/2006
44
• dérive de java.net.DatagramSocket
• Représente le socket en diffusion
La classe java.net.DatagramPacket
• Représente un packet (ou Datagramme) à envoyer ou reçu
10/08/2006
46
Les sockets en mode diffusion restreinte
Utilisation
Coté diffuseur
• crée le MulticastSocket
MulticastSocket ms = new MulticastSocket(); ms.joinGroup(groupInetAddress);
• construit un DatagramPacket d ’émission
byte[] data = new byte[len]; // data doit être « rempli » : data = {'H', 'e', 'l', 'l', 'o'};
DatagramPacket outputPacket = new DatagramPacket(data, data.length, groupInetAddress, port);
• envoie le DatagramPacket au groupe de diffusion
ms.send(outputPacket, ttl);
D. Donsez, 1999-2006, Programmation Réseau en Java
Coté récepteur
• crée le MulticastSocket et rejoindre le groupe
MulticastSocket ms = new MulticastSocket(port); ms.joinGroup(groupInetAddress);
• construit un DatagramPacket de réception
byte[] data = new byte[len]; // data doit être « rempli »
DatagramPacket incomingPacket = new DatagramPacket(data, data.length);
• reçoit le DatagramPacket diffusé
ms.receive(incomingPacket);
10/08/2006
47
Code du Diffuseur
Exemple
import java.net.*; import java.io.*;
public class MulticastSender {
public static void main(String[] args) {
try {
InetAddress ia = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
byte ttl = (byte)Integer.parseInt(args[2]);
MulticastSocket ms = new MulticastSocket();
ms.joinGroup(ia);
D. Donsez, 1999-2006, Programmation Réseau en Java
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); }
}}
10/08/2006
49
R R
R3
R2
D R0 R1 R5 R5
R R R R
R2 R2
Communication fiables de groupes
en Java
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
Didier.Donsez@imag.fr
10/08/2006
53
1 vers N
Propriétés
• Fragmentation/Recomposition des messages (>64K)
• Ordonnancement
• Garantie de livraison
• Envoi unicast
D. Donsez, 1999-2006, Programmation Réseau en Java
Applications
• Réplication fiable de composants critiques
• Services ou données entre les nœuds d’un cluster
• Bases de données
• Message Queues
• EJB, HttpSession data, …
10/08/2006
54
http://www.sun.com/research/technical-
reports/1998/abstract68.html
Tree-Based Reliable Multicast (TRAM)
• designed to handle the transfer of bulk data via streams or
packets. Because TRAM is tree-based, it localizes error
recovery and congestion control to the parent, thus limiting
D. Donsez, 1999-2006, Programmation Réseau en Java
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
Didier.Donsez@imag.fr
10/08/2006
58
java.net.URL
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");
10/08/2006
59
java.net.URL
Méthodes
Exemple avec les méthodes getXXX()
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");
D. Donsez, 1999-2006, Programmation Réseau en Java
Utilitaires
Chemin relative
• La classe URI offre des méthodes pour la
construction d’URL « relative »
Encodeur/Décoder
• méthodes statiques de conversion
D. Donsez, 1999-2006, Programmation Réseau en Java
new InputStreamReader(aurl.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) System.out.println(inputLine);
in.close();
}
}
10/08/2006
62
La classe de connexion
java.net.URLConnection
Définit une connexion à une URL
• superclasse abstraite indépendante du schéma de connexion
(http, ftp, file, mailto, …)
Sous-classes
D. Donsez, 1999-2006, Programmation Réseau en Java
• HttpURLConnection, JarURLConnection
10/08/2006
63
java.net.URLConnection
Utilisation
• 1- l ’instance est récupéré de URL.openConnection()
• 2- configuration des paramêtres de la connexion
• setAllowUserInteraction, setDoInput, setDoOutput, setIfModifiedSince,
setUseCaches, setRequestProperty
• 3- connexion connect() et obtention d ’un InputStream
D. Donsez, 1999-2006, Programmation Réseau en Java
String inputLine;
while ((inputLine = in.readLine()) != null) System.out.println(inputLine);
in.close();
} }
A tester avec
• http://java.sun.com, https://www.verisign.com, file://./locfile.txt, …
• jar:http://www-adele.imag.fr/~donsez/dev/osgi/helloservice10/helloservice10.jar!/META-INF/MANIFEST.MF
Exercice :
• écrire un robot qui récupère une hiérarchie de documents HTML
à partir d ’une URL
10/08/2006
65
java.net.URLConnection
Exemple d ’envoi de mail
import java.net.*;
import java.io.*;
public class MailSender {
public static void main(String[] args) throws Exception {
URL mailto = new URL("mailto:"+args[0]);
URLConnection mailtocnx= mailto.openConnection();
mailtocnx.connect();
PrintStream p = new PrintStream(mailtocnx.getOutputStream());
D. Donsez, 1999-2006, Programmation Réseau en Java
java.net.HttpURLConnection
• getResponseCode(), getResponseMessage()
• Clôture de la session HTTP
• disconnect() pour les connexions keep-alive
Usage
• robot de récupération, ...
• dialogue client-serveur en tunneling HTTP/TCPIP
avec un serveur HTTP
10/08/2006
67
java.net.HttpURLConnection
Exemple de récupération d ’un document
import java.net.*; import java.io.*;
public class HttpURLConnectionReader {
public static void main(String[] args) throws Exception {
URL httpurl = new URL(args[0]);
HttpURLConnection httpcnx = (HttpURLConnection)httpurl .openConnection();
if(httpcnx.getResponseCode()== HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(
D. Donsez, 1999-2006, Programmation Réseau en Java
new InputStreamReader(httpcnx.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) System.out.println(inputLine);
in.close();
} else { System.err.println(httpcnx.getResponseMessage()); }
} }
10/08/2006
68
java.net.JarURLConnection
• un répertoire : jar:http://www.foo.com/bar/baz.jar!/COM/foo/
• un entrée : 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();
10/08/2006
69
• sous-classe de URLStreamHandler
• par défaut sun.net.www.protocol.<schema>.Handler
• Gestionnaire de connexion
• sous-classe de URLConnection
• Gestionnaire de contenu (type/soustype MIME)
• sous classe de ContentHandler
• par défaut : sun.net.www.content.<type>.<soustype>
10/08/2006
70
• Gestionnaire de schéma
• setURLStreamHandlerFactory(URLStreamHandlerFactory factory)
D. Donsez, 1999-2006, Programmation Réseau en Java
Lire
• http://java.sun.com/developer/onlineTraining/protocolhandlers/
10/08/2006
72
Première Conclusion
Support IPv6
FTP Protocol Handler
SOCkS V5 et V4
• TCP support includes auto-negotiation with the proxy
Entrées-Sorties Non Bloquantes (java.nio)
Memory Mapping (java.nio)
Classes
D. Donsez, 1999-2006, Programmation Réseau en Java
• URI
• Pour analyser manipuler, … des URL
• NetworkAddress
Java Secure Socket Extension (JSSE)
• javax.net.ssl.SSLServerSocketFactory, javax.net.ssl.SSLSocketFactory
• javax.net.ssl.SSLServerSocket, javax.net.ssl.SSLSocket
• javax.net.ssl.SSLSession
• com.sun.net.ssl.HttpsURLConnection
10/08/2006
74
Package java.nio
Entrées-Sorties Non Bloquantes
Nouvelles fonctionnalités du J2SE 1.4
• Permettent à une thread de lancer plusieurs IO simultanément
(asynchrones)
Voir
• http://developer.java.sun.com/developer/technicalArticles/releases/nio/
• http://servlet.java.sun.com/javaone/resources/content/sf2002/conf/sess
D. Donsez, 1999-2006, Programmation Réseau en Java
ions/pdfs/3477.pdf
Un exemple de serveur multithreadé et IO Async
• http://servlet.java.sun.com/javaone/resources/content/sf2002/conf/sess
ions/pdfs/2294.pdf
10/08/2006
77
Package java.nio
Memory Mapping
// Create a FileChannel, get the file size and map the file to a ByteBuffer
java.nio.channels.FileChannel in = new FileInputStream("test.data").getChannel();
int filesize = (int)in.size();
ByteBuffer mappedfile = in.map(FileChannel.MapMode.READ_ONLY, 0, filesize);
// Assume the file contains fixed-size records of binary data.
static final int RECORDSIZE = 80; // The size of each record
int recordNumber = 1; // This is the record we want to read
byte[] recorddata = new byte[RECORDSIZE]; // An array to hold record data
D. Donsez, 1999-2006, Programmation Réseau en Java
API Raw IP
Motivation
• Le JRE ne doit accès qu’aux couches « hautes » d’IP
• Fournir une API similaire permettant
de construire, envoyer, capturer les paquets IP de bas niveau
Utilisation
• Nouvelles couches protocolaires
D. Donsez, 1999-2006, Programmation Réseau en Java
Motivation
• Fournir une API similaire aux sockets sur des couches
protocolaires P2P (JXTA)
Exemple
D. Donsez, 1999-2006, Programmation Réseau en Java
10/08/2006
80
Bibliographie
Architecture et Principe d ’IP
Généralités
• Guy Pujolle, "Les réseaux", Ed Eyrolles , 3ème éd., 2000, ISBN 2-212-09119-2
• Chapitres 12 et 16 : IP dans les grandes lignes
• mise à jour régulière
Détail
• W.R. Stevens, “ TCP/IP Règles et Protocoles ” Volume 1,2 et 3, Ed Vuibert (Addison-
Wesley pour la VA de 1994), 1998, ISBN 2-7117-8639-0
• très détaillé, plus que complet mais commence à dater
• Douglas E. Comer, « Internetworking with TCP/IP volume I », Prentice Hall
D. Donsez, 1999-2006, Programmation Réseau en Java