Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
57 views

Programmation Reseau en Java

This document discusses network programming in Java using various Java network APIs. It describes the InetAddress class for representing IP addresses and resolving host names. It provides an example of using InetAddress to build an object from a byte array or string representing an IP address. It also covers TCP sockets using the Socket and ServerSocket classes for connected socket communication between a client and server. The ServerSocket class is used on the server to listen for connection requests and accept them, returning a Socket to communicate with the client.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views

Programmation Reseau en Java

This document discusses network programming in Java using various Java network APIs. It describes the InetAddress class for representing IP addresses and resolving host names. It provides an example of using InetAddress to build an object from a byte array or string representing an IP address. It also covers TCP sockets using the Socket and ServerSocket classes for connected socket communication between a client and server. The ServerSocket class is used on the server to listen for connection requests and accept them, returning a Socket to communicate with the client.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 76

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

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

 Représente une adresse IP


• utilisé par les classes Socket et DatagramSocket
 3 méthodes statiques pour la résolution DNS
public static InetAddress getByName(String hostname) throws UnknownHostException
public static InetAddress[] getByName(String hostname) throws UnknownHostException
• donne l ’adresse(s) de l ’hôte dont le DN est passé en paramètre
public static InetAddress getLocalHost() throws UnknownHostException
D. Donsez, 1999-2006, Programmation Réseau en Java

• donne l ’adresse de l ’hôte local

• 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

Les sockets en mode connecté


java.net.Socket et java.net.ServerSocket

 Représente une connexion fiable TCP/IP


entre 2 processus (qui peuvent ne être des JVM !)
• la connexion est fiable (contrôle d ’erreur, …)
• et 2 flots de données sont établis entre les deux machines
 La connexion est asymétrique
• Une machine est serveur : classe ServerSocket
D. Donsez, 1999-2006, Programmation Réseau en Java

• elle attend les demandes de connexion et les accepte


• Une machine est client : classe Socket
• elle demande l ’établissement de la connexion avec le serveur
 Terminologie
• La connexion est dite en mode connecté
10/08/2006
6
Les sockets en mode connecté
Utilisation
 Coté serveur : classe ServerSocket
• crée le ServerSocket :
ServerSocket listenSocket = new ServerSocket(port);
• attend les demandes de connexion et crée un socket pour le dialogue
Socket clientSocket = listenSocket.accept();
• récupère les flux d ’entrée et de sortie
InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();
• dialogue avec le serveur
D. Donsez, 1999-2006, Programmation Réseau en Java

 Coté client : classe Socket


• crée le Socket :
Socket server = new Socket(host,port);
• récupère les flux d ’entrée et de sortie
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
• dialogue avec le serveur
10/08/2006
7
Socket TCP
Déroulement de l ’exécution
hostcli hostser
hostcli hostser
JVM
JVMTCPClient
TCPClient JVM
JVMTCPServer
TCPServer
main thread main thread
person thread(s) Création d ’un ServerSocket
Attente d ’une demande de connexion
accept()

Création d ’un Socket


Récupération
Récupération des flots d ’entrée et de sortie
des flots d ’entrée et de sortie getInputStream() et getOutputStream()
getInputStream() et getOutputStream()
D. Donsez, 1999-2006, Programmation Réseau en Java

Echange de données avec le Echange de données avec le


serveur suivant un protocole client suivant un protocole
applicatif (couche 7) applicatif (couche 7)
read(), write(), flush() read(), write(), flush()

Fermeture de la connexion close()


Fermeture de la connexion close()
Attente d ’une autre demande de
Terminaison de la JVM connexion d ’un autre client accept()
10/08/2006
Socket TCP 8

Remarques lors du déroulement de


l ’exécution
 Le serveur
• Après la fermeture de la connexion, le serveur se met en attente du nouvelle
connexion du même client ou d ’un autre
• Si plusieurs demandes connexions arrivent simultanément, une seule est acceptée
et les autres sont mises en attente jusqu ’au accept() suivant (modulo les timeouts)
• pour accepter et traiter plusieurs connexions simultanées, la solution est de multithreadé
le serveur
 Le protocole
D. Donsez, 1999-2006, Programmation Réseau en Java

• Le client et le serveur doivent respecter un protocole valide d ’échange des


données selon un automate.
• le client envoie un entier mais le serveur attend un flottant
• le client attend des données du serveur qui lui même attend des données du client
il y a interblocage
• Attention à l ’hétérogénéité des plates-formes client et serveur
• un client sur Intel envoie un entier little-endian
• le serveur sur Sparc reçoit cet entier et le traite en big-endian
10/08/2006
9
Socket TCP
Les échanges
 2 types d’échanges possible
• Echange en mode Ligne
• Echange en mode Bloc de bytes
D. Donsez, 1999-2006, Programmation Réseau en Java
10/08/2006
10
Socket TCP
Echange en mode Ligne
 Les requêtes et les réponses sont constituées
d ’une ou plusieurs lignes de texte (ASCII 7 bits, UTF-8,
UniCode, , www-url-encoded, ASN1, ...)
• Exemple de protocole en mode ligne : HTTP, FTP, SMTP, …
• Avantage pour le mise au point :
• le client peut être un client telnet
• telnet www 80, telnet mailhost 25
 En java
D. Donsez, 1999-2006, Programmation Réseau en Java

• Utilisation des Classes java.io.BufferedReader/BufferedWriter


• Pour l’encodage et le décodage des lignes
 Attention
• Les terminateurs de ligne varient selon les OS:
• tantôt LF '\n', tantôt CR '\r', tantôt CRLF "\r\n", …
• L’encodage n’est pas supporté par tous les langages
• Certains protocoles (HTTP, SMTP, …) limitent la longueur des lignes
• Sécurité : Risque d’attaque par Buffer Overflow (pas en Java)
10/08/2006
11
Socket TCP
Echange en mode Bloc de bytes
 Les requêtes et les réponses sont des blocs de bytes d ’une
taille et d ’un format connus de l ’autre
• Exemples : RPC, RMI, CORBA, LDAP ...
• Le bloc peut avoir un entête qui contient un code d ’opération
et la longueur du corps du bloc qui contient les données
 En Java
• Utilisation possible des Classes java.io.DataInputStream/DataOutputStream
D. Donsez, 1999-2006, Programmation Réseau en Java

• Mais impose que le client et le serveur soient des JVMs


 Attention
• Les données sont représentées de manière différente selon les
architectures, les OS et les langages
• Big/Little Endian, IEEE, …
• il faut alors un format pivot de représentation (XDR, IIOP …)
10/08/2006
12
Socket TCP
Echange en mode Bloc de bytes
 Représentation des éléments variables

 Représentation des listes variables

 Remarque
• Ces solutions sont applicables
D. Donsez, 1999-2006, Programmation Réseau en Java

• Aux échanges en mode ligne


• Aux datagrammes UDP
10/08/2006
13

Exemple du Code du Client


import java.net.*; import java.io.*;
public class EchoClient {
public static void main(String[] args) {
Socket theSocket;
DataInputStream theInputStream; DataInputStream userInput;
PrintStream theOutputStream;
String theLine;
try {
theSocket = new Socket(args[0], Integer.parseInt(args[1]));
theInputStream = new DataInputStream(theSocket.getInputStream());
D. Donsez, 1999-2006, Programmation Réseau en Java

theOutputStream = new PrintStream(theSocket.getOutputStream());


userInput = new DataInputStream(System.in);
while (true) {
theLine = userInput.readLine();
if (theLine.equals(".")) break;
theOutputStream.println(theLine);
System.out.println(theInputStream.readLine());
}
} catch (UnknownHostException e) { System.err.println(e);
} catch (IOException e) { System.err.println(e); } } }
10/08/2006
14

Exemple d ’un Code du Serveur


import java.net.*; import java.io.*;
public class EchoServer {
void doService(Socket clientSocket) {
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
PrintStream out = new PrintStream(clientSocket.getOutputStream());
while (true) {String theLine=in.readLine(); out.println(theLine); }
}
public static void main(String[] args) {
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

SMTP(br,out,args[1], args[2], args[3], args[4], args[5]);}

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

statusline = br.readLine(); System.out.println(statusline);


cmdstr = "DATA" + CRLF
+ "TO:" TO + CRLF
+ "SUBJECT:" + SUBJECT + CRLF
+ MSG + CRLF
+ "." + CRLF;
out.writeBytes(cmdstr); out.flush(); System.out.print(cmdstr);
statusline = br.readLine(); System.out.println(statusline);
cmdstr ="QUIT" + CRLF;
out.writeBytes(cmdstr); out.flush(); System.out.print(cmdstr);
}}
10/08/2006
19

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

• le hôte n ’est pas joignable


 java.net.ProtocolException
• erreur du protocole (TCP, …)
 java.net.SocketException
• erreur du protocole (TCP, …)
 java.net.UnknownHostException
• erreur de DNS
10/08/2006
20

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

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 retirées d ’un pool
• avantage : limiter le coût d ’initialisation des threads de service
une thread sert plusieurs requêtes successives de clients différents
10/08/2006
21
Socket TCP
Déroulement de l ’exécution multithreadée
hostcli hostser
hostcli hostser
JVM
JVMTCPClient
TCPClient dispatcher JVM
JVMTCPServer
TCPServer
thread
main thread Création d ’un ServerSocket
Attente d ’une demande de connexion
accept()

Création d ’un Socket service thread


Création et démarrage de la thread de service
ou récupération d ’une thread dans le pool
Récupération
des flots d ’entrée et de sortie Récupération
Attente d ’une autre des flots d ’entrée et de sortie
getInputStream() et getOutputStream() demande de connexion
getInputStream() et getOutputStream()
D. Donsez, 1999-2006, Programmation Réseau en Java

d ’un autre client accept()

Echange de données avec le Echange de données avec le


serveur suivant un protocole client suivant un protocole
applicatif (couche 7) applicatif (couche 7)
read(), write(), flush() read(), write(), flush()

Fermeture de la connexion close() Fermeture de la


connexion close()
Terminaison de la thread de service
Terminaison de la JVM ou retour dans le pool
10/08/2006
22

Code du Serveur Multithreadé


import java.net.*; import java.io.*;
public class EchoServer extends Thread {
private Socket clientSocket;
EchoServer(Socket clientSocket) {this.clientSocket=clientSocket;}
public static void main(String[] args) {
ServerSocket listenSocket;
try {
listenSocket = new ServerSocket(Integer.parseInt(args[0])); // port
while(true) { // le dispatcher est la thread qui exécute main()
Socket clientSocket = listenSocket.accept();
D. Donsez, 1999-2006, Programmation Réseau en Java

System.err.println("Connexion from:" + clientSocket.getInetAddress());


EchoServer serviceThread = new EchoServer(clientSocket);
serviceThread.start();
} catch (Exception e) { System.err.println(e); }
}
public void run() { doService(clientSocket); }
public void doService(Socket clientSocket) {
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
PrintStream out = new PrintStream(clientSocket.getOutputStream());
while (true) { String theLine=in.readLine(); out.println(theLine); }
}
}
10/08/2006
23
Code du Serveur Multithreadé
(Version Abstraite 1/2)
import java.net.*; import java.io.*;
public class TCPServer extends Thread {
private int port;
public static void main(String[] args) {
ServerSocket listenSocket;
try {
init(args);
listenSocket = new ServerSocket(port); // port
while(true) { // le dispatcher est la thread qui exécute main()
Socket clientSocket = listenSocket.accept();
D. Donsez, 1999-2006, Programmation Réseau en Java

System.err.println("Connexion from:" + clientSocket.getInetAddress());


TCPServer serviceThread = newServer(clientSocket);
serviceThread.start();
} catch (Exception e) { System.err.println(e); }
}
protected abstract void init(String[] args) { port=Integer.parseInt(args[0]); };
protected abstract TCPServer newServer(Socket clientSocket);
private final void run() { doService(clientSocket); }
protected abstract void doService(Socket clientSocket);
}
10/08/2006
24
Code du Serveur Multithreadé
(Version Abstraite 2/2)
import java.net.*; import java.io.*;
public abstract class EchoServer extends TCPServer {
private Socket clientSocket;

private EchoServer(Socket clientSocket) {super(); this.clientSocket=clientSocket;}

protected void init(String[] args) { init(args) };

protected TCPServer newServer(Socket clientSocket) {


D. Donsez, 1999-2006, Programmation Réseau en Java

return new EchoServer(clientSocket);


};

protected void doService(Socket clientSocket) {


DataInputStream in = new DataInputStream(clientSocket.getInputStream());
PrintStream out = new PrintStream(clientSocket.getOutputStream());
while (true) { String theLine=in.readLine(); out.println(theLine); }
}
}
10/08/2006
25

Personnaliser un type de Socket

 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

Personnaliser un type de Socket

 Méthode 2 : encapsulation par héritage


• 1- Dériver 2 nouvelles classes des classes
java.io.FilterOutputStream et java.io.FilterInputStream
• 2- Dériver 2 nouvelles classes des classes
java.net.Socket et java.net.SocketServer
• Exemple
CompressionOutputStream et CompressionInputStream
D. Donsez, 1999-2006, Programmation Réseau en Java

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

public InputStream getInputStream() throws IOException {


if (in == null) in = new CompressionInputStream(super.getInputStream());
return in; }
public OutputStream getOutputStream() throws IOException {
if (out == null) out = new CompressionOutputStream(super.getOutputStream(), compressionrate);
return out; }
public synchronized void close() throws IOException {
OutputStream o = getOutputStream(); o.flush(); super.close();
}}
10/08/2006
28
Personnaliser un type de Socket
Sous classe de SocketServer
import java.io.*;
import java.net.*;
class CompressionServerSocket extends ServerSocket {
public CompressionServerSocket(int port, int compressionrate) throws IOException {
super(port);
}
public Socket accept() throws IOException {
Socket s = new CompressionSocket(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

 Relai sur des connexions TCP au travers d ’un


pare-feu
• SOCKS (RFC1928 pour V5)
• V4 pour Java
• http://www.socks.nec.com/socks4.protocol
D. Donsez, 1999-2006, Programmation Réseau en Java

 Propriétés
• socksProxyHost, socksProxyPort

• java -DsocksProxyHost=bastion socksProxyPort=1081


EchoTCPClient server 1234
10/08/2006
31

JSSE Java Secure Socket Extension

 Extension javax.net permettant de sécuriser une socket


avec SSL
• Package javax.net.ssl
• Fournit aussi un provider JCE pour les algorithmes crypto.
• Utilisable avec les RMI, CORBA, HTTP, ...
• Désormais distribuée dans J2SE 1.4
 Classes
D. Donsez, 1999-2006, Programmation Réseau en Java

• 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

JSSE Exemple de client


import java.io.*;
import javax.net.ssl.*;
...
String host = args[0];
int port = Integer.parse(args[1]);
try {
SSLSocketFactory sslFact = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket s = (SSLSocket)sslFact.createSocket(host, port);
D. Donsez, 1999-2006, Programmation Réseau en Java

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

JSSE Exemple de serveur


import java.io.*;
import javax.net.ssl.*;
...
int port = Integer.parse(args[0]);
try {
SSLServerSocketFactory sslSrvFact
= (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket s =(SSLServerSocket)sslSrvFact.createServerSocket(port);
D. Donsez, 1999-2006, Programmation Réseau en Java

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

SSLContext ctx = SSLContext.getInstance("TLS");


ctx.init(kmf.getKeyManagers(), null, null);
factory = ctx.getSocketFactory();
} catch (Exception e) { throw new IOException(e.getMessage()); }
SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
socket.startHandshake();

Programmation UDP
en Java

Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE

Didier.Donsez@imag.fr
10/08/2006
36

Les sockets en mode non connecté

 Rappel sur UDP


• couche de transport non fiable en mode non connecté
• contrôle des erreurs mais pas de reprise sur erreur,
pas d ’ACK, séquencement des paquets non garanti
• plus simple que TCP et plus efficace pour certaines applications
(envoi de vidéo, audio, mesures, TFTP, NFS, DNS …)
 Principe
D. Donsez, 1999-2006, Programmation Réseau en Java

• l ’envoyeur (sender) envoie un datagramme (paquets de


données sur un socket que le receveur (receiver) écoute.
 La classe java.net.DatagramSocket
• Représente le socket local ou distant en mode non connecté
 La classe java.net.DatagramPacket
• Représente un packet (ou Datagramme) à envoyer ou reçu
10/08/2006
37
Les sockets en mode non connecté
Utilisation
 Coté émetteur
• crée 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);
• envoie le DatagramPacket au recepteur
ms.send(outputPacket);
 Coté récepteur
D. Donsez, 1999-2006, Programmation Réseau en Java

• crée le DatagramSocket lié à un port d ’écoute


DatagramSocket theSocket = new DatagramSocket(port);
• construit un DatagramPacket pour la réception
byte[] incomingData = new byte[MAXLEN]; // buffer vide
DatagramPacket incomingPacket = new DatagramPacket(data, data.length);
• réception le DatagramPacket du paquet puis utilisation
theSocket.receive(incomingPacket);
10/08/2006
38
Socket UDP
Déroulement de l ’exécution
hostsen hostrec
hostsen hostrec
JVM
JVMUDPSender
UDPSender JVM
JVMUDPReceiver
UDPReceiver
main thread main thread
Création d ’un DatagramSocket
Création d ’un DatagramSocket Création d ’un DatagramPacket
Création du DatagramPacket 1 Début d ’attente de réception d ’un
Envoi du DatagramPacket 1 DatagramPacket

Création du DatagramPacket 2 Réception d ’un DatagramPacket 1


Envoi du DatagramPacket 2
Erreur Début d ’attente de réception d ’un
Création du DatagramPacket 3
D. Donsez, 1999-2006, Programmation Réseau en Java

Envoi du DatagramPacket 3
(paquet 2 perdu) DatagramPacket

Création du DatagramPacket 4 Erreur Détectée par la JVM


Envoi du DatagramPacket 4 (paquet 3 erroné)
Création du DatagramPacket 5
Envoi du DatagramPacket 5
Déséquencement Réception d ’un DatagramPacket 5
des paquets 4 et 5 Début d ’attente de réception d ’un
L ’émetteur ne le sait pas
DatagramPacket
Terminaison de la JVM
Réception d ’un DatagramPacket 4
10/08/2006
39
Code du Emetteur
Exemple
import java.net.*; import java.io.*;
public class UDPSender {
public static void main(String[] args) {
try {
InetAddress receiver = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
DatagramSocket theSocket = new DatagramSocket();
DataInputStream userInput = new DataInputStream(System.in);
while (true) {
D. Donsez, 1999-2006, Programmation Réseau en Java

String theLine = userInput.readLine();


if (theLine.equals(".")) break;
byte[] data = new byte[theLine.length()];
theLine.getBytes(0, theLine.length(), data, 0);
DatagramPacket theOutput =
new DatagramPacket(data, data.length, receiver, port);
theSocket.send(theOutput);
}
} catch (Exception e) { System.err.println(e);}
}}
10/08/2006
40
Code du Récepteur
Exemple
import java.net.*; import java.io.*;
public class UDPReceiver {
public static void main(String[] args) {
try {
// construction d'un DatagramSocket
int port = Integer.parseInt(args[0]);
DatagramSocket ds = new DatagramSocket(port);
// construction d'un DatagramPacket
int len = Integer.parseInt(args[1]);
D. Donsez, 1999-2006, Programmation Réseau en Java

byte[] buffer = new byte[len];


DatagramPacket incomingPacket = new DatagramPacket(buffer, buffer.length);
while (true) {
ds.receive(incomingPacket);
String s =
new String(incomingPacket.getData(), 0, 0, incomingPacket.getLength());
System.out.println(incomingPacket.getAddress()
+ " at port " + incomingPacket.getPort() + " says " + s);
}
} catch (Exception e) { System.err.println(e); }
}}
10/08/2006
41

Remarques

 Fragmentation IP [Stevens Tome1 Chap11 Sect5]


• le DatagramPacket peut être fragmenté pour les couches
inférieur (IP,Ethernet,…) par la couche UDP
• ! La taille maximun d ’un paquet IP est de 65535 octets
• Il est reassemblé par la couche UDP du récepteur avec d ’être
remis
 Fiabilité sur UDP
D. Donsez, 1999-2006, Programmation Réseau en Java

• La fiabilité peut être garantie au niveau applicatif


par le développeur
• par l ’ajout de numéro de séquence, de date (horloge de Mattern), de
timeout pour les reprises ...
• dans les messages contenant les données ou de service
• Lecture
• les 3 tomes de Raynal
10/08/2006
42

La classe java.net.DatagramPacket

• Représente un packet (ou Datagramme)


à envoyer ou reçu par UDP ou IP MultiCast
• Contient un tableau de byte
qui peut être récupérer ou positionner
avec les méthodes getData()/setData(), setLength()/getLength()
• Contient également l’adresse et le port de l ’émetteur
méthodes getAddress() getPort()
• Contient également l’adresse et le port du récepteur
D. Donsez, 1999-2006, Programmation Réseau en Java

méthodes setAddress() setPort()


• Peut être structuré pour l ’envoi de messages structurés
• DatagramPacket ne peut être dérivé : classe finale
• la structure peut contenir un numéro de séquence, horloge de Mattern,
… pour assurer un niveau de fiabilité
• peut contenir un objet sérialisé (ou externalisé)
uniquement si l ’émetteur et le récepteur sont des JVMs.
Programmation MultiCast
en Java

Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE

Didier.Donsez@imag.fr
10/08/2006
44

Rappel sur l ’IP MultiCast

 Couche de transport non fiable en mode diffusion restreinte


• contrôle des erreurs mais pas de reprise sur erreur,
pas d ’ACK, séquencement des paquets non garanti
• utilisé pour les applications de diffusion restreinte
• vidéo/audio-conférence, cours de bourse … lookup de JINI
• voir http://www.univ-valenciennes.fr/CRU/OR/
 UDP Unicast vs IP MultiCast
• UDP envoie un paquet de données
D. Donsez, 1999-2006, Programmation Réseau en Java

d ’un point (hôte) vers un autre (hôte,port)


• IP Multicast envoie une suite de paquets de données d ’un point (hôte) vers un
groupe d ’N hôtes qui souhaitent recevoir ces données
 Groupe MultiCast
• spécifié par une adresse de classe D (de 224.0.0.1 à 239.255.255.255)
• et par un port (UDP)
 Voir : http://www.ipmulticast.com
10/08/2006
45
Utilisation des sockets
en mode diffusion multicast
 Principe
• le diffuseur (multicaster) rejoint un groupe multicast et envoie
un datagramme sur ce groupe
• les récepteurs (receiver) qui ont rejoint le groupe reçoivent les
datagrammes envoyés par les diffuseurs.
 La classe java.net.MulticastSocket
D. Donsez, 1999-2006, Programmation Réseau en Java

• 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

DataInputStream userInput = new DataInputStream(System.in);


while (true) {
String theLine = userInput.readLine(); if (theLine.equals(".")) break;
byte[] data = new byte[theLine.length()];
theLine.getBytes(0, theLine.length(), data, 0);
DatagramPacket dp = new DatagramPacket(data, data.length, ia, port);
ms.send(dp,ttl);
}
ms.leaveGroup(ia);
ms.close();
} catch (Exception e) { System.err.println(e); } } }
10/08/2006
48
Code du Receveur
Exemple
import java.net.*; import java.io.*;
public class MulticastReceiver {
public static void main(String[] args) {
try {
// paquet de réception
byte[] buffer = new byte[65509];
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);

InetAddress ia = InetAddress.getByName(args[0]); // adresse de classe D


D. Donsez, 1999-2006, Programmation Réseau en Java

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); }
}}
10/08/2006
49

Remarques sur MulticastSocket

• Un socket n ’a pas besoin être membre d ’un groupe multicast pour y


envoyer de message.
• Les adresses de classe D sont comprises
• 224.0.0.0 - 239.255.255.255

• Les adresses de classes D déjà réservées sont sur


ftp://ftp.isi.edu/in-notes/iana/assignments/multicast-addresses
...
D. Donsez, 1999-2006, Programmation Réseau en Java

224.0.18.000-224.0.18.255 Dow Jones


224.0.19.000-224.0.19.063 Walt Disney Company
...
• Les applets ne sont pas autorisées à utiliser les sockets multicast
• Quand un message est envoyé, tous les membres d ’un groupe reçoivent le
message dans l ’intervalle du TTL (time-to-live)
10/08/2006
50

Remarques sur le Time-To-Live

• Le TTL (time-to-live) représente le nombre de routeurs


(sauts/hops) le paquet peut traverser avant d’être abandonné.
• 0 pour l ’émetteur
• 1 pour le LAN
• ...
• 128 pour le monde entier
D. Donsez, 1999-2006, Programmation Réseau en Java

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

Communications fiables de groupes

 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

Communications fiables de groupes

 Opérations sur les groupes


• Joindre/quitter
• Diffuser aux membres du groupe
• Réception de messages
• Notification d’arrivée et de retrait d’un nœud
• Spécification de la notion d’ordre entre les messages
D. Donsez, 1999-2006, Programmation Réseau en Java
10/08/2006
55

JavaGroup Under Construction


http://www.javagroups.com En Construction

 Implantation Java des communications fiables de


groupe
 Classe Channel
D. Donsez, 1999-2006, Programmation Réseau en Java
10/08/2006
56

JRMS (Java Reliable Multicast Service)


Sun Labs Under Construction
En Construction

 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

the overhead required for the sender. However, the tree


structure of TRAM also limits it to a single sender
 Light-Weight Reliable Multicast Protocol (LRMP).
• designed to transmit small groups of data and allow multiple
senders.
Les classes de Connexion
java.net.URL
java.net.URLConnection

Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
Didier.Donsez@imag.fr
10/08/2006
58

java.net.URL

 Définit une URL


 Méthodes
String getProtocol(), String getHost(), String getPort(), String getRef()
InputStream openStream()
permet d ’obtenir un InputStream d ’une connexion au serveur
URLConnection openConnection()
permet d ’obtenir un URLConnection
D. Donsez, 1999-2006, Programmation Réseau en Java

 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

System.out.println("protocol = " + aURL.getProtocol());


System.out.println("host = " + aURL.getHost()+ " filename = " +
aURL.getFile());
System.out.println("port = " + aURL.getPort() + " ref = " + aURL.getRef());
} }
10/08/2006
60

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

x-www-form-urlencoded vers/depuis String


static String URLDecoder.decode(String urlencoded)
static String URLEncoder.encode(String str)
10/08/2006
java.net.URL 61

Exemple de récupération d ’un


document
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception {
URL aurl = new URL(args[0]);
BufferedReader in = new BufferedReader(
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

• 4- récupération des champs d ’entête (header fields)


• getContent, getHeaderField, getContentEncoding, getContentLength,
getContentType, getDate, getExpiration, getLastModifed
10/08/2006
64
java.net.URLConnection
Exemple de récupération d ’un document
import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static void main(String[] args) throws Exception {
URL aurl = new URL(args[0]);
URLConnection aurlcnx = aurl.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(aurlcnx.getInputStream()));
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

p.println("Subject: Test\r\n\r\nSalut !");


p.close();
} }
10/08/2006
66

java.net.HttpURLConnection

 Sous interface de URLConnection


• Récupération d ’un document via une connexion HTTP
 Méthodes
• Positionnement des champs de la requête HTTP
• setRequestedMethod()
• Récupération des champs de la réponse HTTP
D. Donsez, 1999-2006, Programmation Réseau en Java

• 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

 Sous interface de URLConnection


• Récupération d ’un Jar file ou d ’une de ses entrées
 Syntaxe des URL
jar:<url>!/{entry} !/ est un séparateur
• un Jar file : jar:http://www.foo.com/bar/baz.jar!/
• un Jar file : jar:file:/local/dev/bar/baz.jar!/
D. Donsez, 1999-2006, Programmation Réseau en Java

• 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

Les gestionnaires pour URL

 Architecture logicielle ouverte autour d ’URL


• Ajout de nouveaux schémas (https, vod, mcast,...)
• Ajout de nouveaux types de ressources (image/fract)
• Personnalisation des gestionnaires existants (http, ...)
 3 classes d ’objets
• Gestionnaire de schéma
D. Donsez, 1999-2006, Programmation Réseau en Java

• 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

Les gestionnaires pour URL

 Personnalisation des Gestionnaires


• Constructeurs d ’URL
• Méthodes d ’URL

• Gestionnaire de schéma
• setURLStreamHandlerFactory(URLStreamHandlerFactory factory)
D. Donsez, 1999-2006, Programmation Réseau en Java

• Gestionnaire de contenu (type/soustype MIME)


• setContentHandlerFactory(ContentHandlerFactory factory)

 Lire
• http://java.sun.com/developer/onlineTraining/protocolhandlers/
10/08/2006
72

Première Conclusion

 API Réseau de Java


• Socket/ServerSocket, DatagramSocket et MulticastSocket
fournissent un API réseau bas niveau
au dessus de TCP/IP, UDP/IP et IP MultiCast
 Cependant
• les messages et flux de données ne sont pas structurés
D. Donsez, 1999-2006, Programmation Réseau en Java

• Solution 1 pour du Client-Serveur


• Des outils plus adaptés (RPC, RMI, CORBA) masquent
au développeur les détails de la connexion et le codage des messages
• Solution 2 pour du Client-Serveur
• java.net offre aussi des classes URL et URLConnection pour la
récupération de données au dessus de protocoles comme HTTP, FTP,
… (voir cours sur HTTP).
10/08/2006
73

Ajout du J2SE 1.4

 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

mappedfile.position(recordNumber*RECORDSIZE); // Start of desired record


mappedfile.get(recorddata); // Fill the array from the buffer

FileLock lock = in.lock(recordNumber*RECORDSIZE, // Start of locked region


RECORDSIZE, // Length of locked region
true); // Shared lock: prevent concurrent updates
// Now read the desired record, then release the lock when done
lock.release()
10/08/2006
78

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

• Outils d’analyse réseaux (sniffer, trafic analyser, …)


 Liens
• JPCAP
http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html
10/08/2006
79

JXTA Socket API

 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

• 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
 Liens
• http://www.yahoo.com/Computers/Software/Protocols/IP/
10/08/2006
81
Bibliographie
View publication stats

Programmation des Sockets


 Voir les Guides du JSK
 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
• détaille bien la programmation TCP, UDP et MultiCast en Java
 Elliotte Rusty Harold, « Programmation Réseau avec Java », Ed O Reilly,
1997, ISBN 2-84177-034-6
 Scott Oaks, Henry Wong, "Java Threads", 2nd Edition,Ed Oreilly, 1999, 1-
D. Donsez, 1999-2006, Programmation Réseau en Java

56592-418-5, existe en français


• voir Chapitre 5 pour les serveurs multithreadés
 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 ”,
2ème édition, 1998, Ed Wiley, ISBN 0-471-24578-X.
• voir le chapitre 10 qui compare les Sockets à CORBA

You might also like