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.
[Link]
Programmation Réseau
en Java
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – LSR/ADELE
[Link]@[Link], [Link]@[Link]
10/08/2006
2
Les API Réseau de Java
[Link] et [Link]
• Classes et interfaces du paquetage [Link], [Link]
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 [Link]
• Exemple
InetAddress server;
try {
if ([Link] > 0) { server = [Link](args[0]); }
else { server = [Link](); }
[Link](server); // affiche le nom du server
} catch (UnknownHostException e) { [Link]("Could not find this computer's address."); }
10/08/2006
4
Exemple d ’après [Rusty - chapitre 4]
avec [Link]
package [Link]; import [Link];
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();
[Link] = (addr[3] & 0xFF) | ((addr[2] << 8) & 0xFF00);
| ((addr[1] << 16) & 0xFF0000) | ((addr[0] << 24) & 0xFF000000);
return ia;
} catch (Exception e) { throw new UnknownHostException([Link]()); }
D. Donsez, 1999-2006, Programmation Réseau en Java
}
// Use a String like [Link] 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 ([Link]() != [Link]) { throw new UnknownHostException(s + " is not a valid IP address"); }
for (int i = 0; i < [Link]; i++) {
int thisByte = [Link]([Link]());
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([Link](args[0])); // port
while(true) {
Socket clientSocket = [Link]();
[Link]("Connexion from:" + [Link]());
doService(clientSocket);
} catch (Exception e) { [Link](e); }
}
}
10/08/2006
16
Exemple d ’un Code d ’un Client SMTP
(i)
// java SMTPMailer yourmailhost yourmaildomain yourcorrespondentdaddress youraddress Hi "Hello You"
import [Link].*;
import [Link].*;
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([Link]());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
DataOutputStream out = new DataOutputStream([Link]());
D. Donsez, 1999-2006, Programmation Réseau en Java
[Link]();
} catch(IOException ioe) {
[Link]("Erreur de connection : " + [Link]());
}
}…
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 = [Link](); [Link](statusline); // le serveur se présente
cmdstr="HELO " + MAILDOMAIN + CRLF; // EHLO pour les ordres étendus
[Link](cmdstr); [Link](); [Link](cmdstr);
statusline = [Link](); [Link](statusline);
cmdstr ="MAIL FROM:"+ FROM + CRLF;
[Link](cmdstr); [Link](); [Link](cmdstr);
cmdstr ="RCPT TO:" + TO + CRLF;
[Link](cmdstr); [Link](); [Link](cmdstr);
D. Donsez, 1999-2006, Programmation Réseau en Java
Les exceptions
[Link]
• erreur de liaison à une adresse locale (le port est peut être déjà
lié)
[Link]
• refus de connexion par l ’hôte (pas de process qui écoute le
port, …)
[Link]
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
[Link] (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 [Link] et [Link]
D. Donsez, 1999-2006, Programmation Réseau en Java
• CompressionOutputStream et CompressionInputStream
• Méthode 1:
Socket sock = new Socket(...);
InputStream in = new CompressionInputStream([Link]());
OutputStream out = new CompressionOutputStream([Link](), 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\[Link]
10/08/2006
27
Personnaliser un type de Socket
Sous classe de Socket
import [Link].*; import [Link].*;
class CompressionSocket extends Socket {
private int compressionrate;
private InputStream in;
private OutputStream out;
public CompressionSocket(int compressionrate) {
super(); [Link]=compressionrate;
}
public CompressionSocket(String host, int port, int compressionrate) throws IOException {
super(host, port); [Link]=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 [Link] "localhost:3003", "listen";
permission [Link] "serveur", "connect,accept";
permission [Link] "*.[Link]-2000", "connect";
permission [Link] "*.[Link]-", "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\[Link]
• 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
[Link]();
OutputStream out = [Link]();
InputStream in = [Link]();
// 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)[Link]();
OutputStream out = [Link]();
InputStream in = [Link]();
// 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 = [Link]("JKS");
[Link](new FileInputStream("testkeys"), passphrase);
KeyManagerFactory kmf = [Link]("SunX509");
[Link](ks, passphrase);
D. Donsez, 1999-2006, Programmation Réseau en Java
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
[Link]@[Link]
10/08/2006
36
Envoi du DatagramPacket 3
(paquet 2 perdu) DatagramPacket
Remarques
La classe [Link]
Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
[Link]@[Link]
10/08/2006
44
• dérive de [Link]
• Représente le socket en diffusion
La classe [Link]
• 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(); [Link](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, [Link], groupInetAddress, port);
• envoie le DatagramPacket au groupe de diffusion
[Link](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); [Link](groupInetAddress);
• construit un DatagramPacket de réception
byte[] data = new byte[len]; // data doit être « rempli »
DatagramPacket incomingPacket = new DatagramPacket(data, [Link]);
• reçoit le DatagramPacket diffusé
[Link](incomingPacket);
10/08/2006
47
Code du Diffuseur
Exemple
import [Link].*; import [Link].*;
public class MulticastSender {
public static void main(String[] args) {
try {
InetAddress ia = [Link](args[0]);
int port = [Link](args[1]);
byte ttl = (byte)[Link](args[2]);
MulticastSocket ms = new MulticastSocket();
[Link](ia);
D. Donsez, 1999-2006, Programmation Réseau en Java
while (true) {
[Link](dp);
String s = new String([Link](), 0, 0, [Link]());
[Link](s);
}
} catch (Exception e) { [Link](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
[Link]@[Link]
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
[Link]
reports/1998/[Link]
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
[Link]@[Link]
10/08/2006
58
[Link]
Constructeurs
URL localfile = new URL("/users/donsez/pages/cours/[Link]");
URL gamelan = new URL("[Link]
URL gamelanGames = new URL(gamelan, "[Link]");
URL gamelanNetwork = new URL(gamelan, "[Link]");
URL gamelanNetworkBottom = new URL(gamelanNetwork, "#BOTTOM");
URL gamelanNetwork2 = new URL("http", "[Link]", "/pages/[Link]");
10/08/2006
59
[Link]
Méthodes
Exemple avec les méthodes getXXX()
import [Link].*; import [Link].*;
public class ParseURL {
public static void main(String[] args) throws Exception {
URL aURL = new URL("[Link] +
"tutorial/[Link]#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([Link]()));
String inputLine;
while ((inputLine = [Link]()) != null) [Link](inputLine);
[Link]();
}
}
10/08/2006
62
La classe de connexion
[Link]
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
[Link]
Utilisation
• 1- l ’instance est récupéré de [Link]()
• 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 = [Link]()) != null) [Link](inputLine);
[Link]();
} }
A tester avec
• [Link] [Link] [Link] …
• jar:[Link]
Exercice :
• écrire un robot qui récupère une hiérarchie de documents HTML
à partir d ’une URL
10/08/2006
65
[Link]
Exemple d ’envoi de mail
import [Link].*;
import [Link].*;
public class MailSender {
public static void main(String[] args) throws Exception {
URL mailto = new URL("[Link]
URLConnection mailtocnx= [Link]();
[Link]();
PrintStream p = new PrintStream([Link]());
D. Donsez, 1999-2006, Programmation Réseau en Java
[Link]
• 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
[Link]
Exemple de récupération d ’un document
import [Link].*; import [Link].*;
public class HttpURLConnectionReader {
public static void main(String[] args) throws Exception {
URL httpurl = new URL(args[0]);
HttpURLConnection httpcnx = (HttpURLConnection)httpurl .openConnection();
if([Link]()== HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(
D. Donsez, 1999-2006, Programmation Réseau en Java
new InputStreamReader([Link]()));
String inputLine;
while ((inputLine = [Link]()) != null) [Link](inputLine);
[Link]();
} else { [Link]([Link]()); }
} }
10/08/2006
68
[Link]
• un répertoire : jar:[Link]
• un entrée : jar:[Link]
Exemple
url = new URL("jar:[Link]
JarURLConnection jarConnection=(JarURLConnection)[Link]();
Manifest manifest = [Link]();
10/08/2006
69
• sous-classe de URLStreamHandler
• par défaut [Link].<schema>.Handler
• Gestionnaire de connexion
• sous-classe de URLConnection
• Gestionnaire de contenu (type/soustype MIME)
• sous classe de ContentHandler
• par défaut : [Link].<type>.<soustype>
10/08/2006
70
• Gestionnaire de schéma
• setURLStreamHandlerFactory(URLStreamHandlerFactory factory)
D. Donsez, 1999-2006, Programmation Réseau en Java
Lire
• [Link]
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 ([Link])
Memory Mapping ([Link])
Classes
D. Donsez, 1999-2006, Programmation Réseau en Java
• URI
• Pour analyser manipuler, … des URL
• NetworkAddress
Java Secure Socket Extension (JSSE)
• [Link], [Link]
• [Link], [Link]
• [Link]
• [Link]
10/08/2006
74
Package [Link]
Entrées-Sorties Non Bloquantes
Nouvelles fonctionnalités du J2SE 1.4
• Permettent à une thread de lancer plusieurs IO simultanément
(asynchrones)
Voir
• [Link]
• [Link]
D. Donsez, 1999-2006, Programmation Réseau en Java
ions/pdfs/[Link]
Un exemple de serveur multithreadé et IO Async
• [Link]
ions/pdfs/[Link]
10/08/2006
77
Package [Link]
Memory Mapping
// Create a FileChannel, get the file size and map the file to a ByteBuffer
[Link] in = new FileInputStream("[Link]").getChannel();
int filesize = (int)[Link]();
ByteBuffer mappedfile = [Link]([Link].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