Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Introduction a la programmation de clients/serveurTCP/IP en Java
Rushed Kanawati
LIPN, CNRS UMR 7030Universite Paris 13
http://lipn.fr/∼[email protected]
December 17, 2012
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 1 / 34
Plan
1 Introduction
2 Classes Java pour la programmation reseaux: TCP/IPLa classe InetAddressClasses pour communication UDPServeur UDP multi-threadsCommunication MulticastCommunication TCP
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 2 / 34
Introduction
Objectifs
Introduction a la programmation d’applications reseaux en Java.
Programmation de clients/serveurs : UDP et TCP
Programmation de clients/Serveur reseaux multi-threads
Programmation d’applications distribuees avec java RMI: RemoteMethod Invocation
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 3 / 34
Introduction
Rappel : Architecture Logicielle TCP/IP
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 4 / 34
Introduction
Communication TCP/TP : Caracterisation
Adresses IP source et destination
Numero de ports source et destination.
Protocole de transport utilise : UDP ou TCP
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 5 / 34
Introduction
Numero de Port
Un port designe le SAP (Service Access Point) de la coucheapplication.
L’adresse d’une application sur le reseau est donc definie par le couple: @IP d la machine : numero de port.
L’IANA1 repartit les numeros de ports en trois categories :
Les ports systemes : 0 - 1023. Sous Linux l’utilisation de ces portsnecessite d’avoir les privileges d’administrateur.Les ports deposes : 1024 - 49151 sont disponibles pour les utilisateurset peuvent eux aussi etre deposes aupres de l’ IANALes ports prives : 49152 a 65535.
1Internet Assigned Numbers Authority, http://www.iana.orgR. Kanawati (LIPN) Programmation reseau en java December 17, 2012 6 / 34
Introduction
Le concept de socket
Un socket est une interface entre une application et un service de lacouche de transport.
Plusieurs types de socket : socket UDP et socket TCP.
Il est represente comme un fichier : l’ecriture dans ce fichiercorresponds a l’envoie d’un message selon le protocole associe (UDPou TCP). La reception d’un message se fait par une operation delecture.
Un socket est associe alors a un protocole de transport et a unnumero de port.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 7 / 34
Classes Java pour la programmation reseaux: TCP/IP
TCP/IP : Programmation en Java
Le paquetage java.net offre les classes de base :
InetAddress : pour la manipulation d’adresses IP.DatagramSocket : pour la manipulation de sockets UDP.DatagramPacket : pour la manipulation de paquets UDP.ServerSocket : pour la manipulation de socket de serveurs TCPSocket : pour la manipulation de socket TCP d’echange de donnees.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 8 / 34
Classes Java pour la programmation reseaux: TCP/IP La classe InetAddress
La classe InetAddress
Cette classe n’offre pas de constructeurs. La creation d’un objet passepar l’appel d’une des methodes statiques suivantes :
static InetAddress getLocalHost() throws
UnknownHostException
Retourne un objet InetAddress representant la machine localepublic static InetAddress getByName(String host) throws
UnknownHostException
Retourne un objet InetAddress qui corresponds ) la resolution par lesysteme DNS de nom host.public static InetAddress[] getAllByName(String host)
throws UnknownHostException
Retourne toutes les adresses retrouvees de host.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 9 / 34
Classes Java pour la programmation reseaux: TCP/IP La classe InetAddress
La classe InetAddress : Exemples
InetAddress a,b,c;
...
try {
a= InetAddress.getLocalHost ();
b= InetAddress.getByName("iutv.univ -paris13.fr");
c= InetAddress.getByName("127.0.0.1");
} catch (UnknownHostException e) { ... }
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 10 / 34
Classes Java pour la programmation reseaux: TCP/IP La classe InetAddress
La classe InetAddress : methodes de services
public String getHostName()
Retourne le nom complet correspondant a l’adresse IP
public String getHostAddress()
Retourne l’adresse IP sous forme numerique.
public byte[] getAddress()
Retourne l’adresse IP sous forme d’une suite d’octets.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 11 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
Rappel : Protocole UDP
UDP opere en mode non connecte : echange de datagramms(paquets)
L’entete d’un paquet UDP contient les numeros de ports source etdestination.
Les adresses IP sont dans l’entete IP encapsule dans le paquet.
Un paquet UDP contient donc : Les adresses IP source et destination,les ports source et destination et le message a envoyer (suite d’octets)
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 12 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
La classe DatagramPacket
Classe de manipulation de paquets UDP.
Constructeur pour encapsuler un paquet UDP a recevoir :DatagramPacket(byte[] buf, int length)
ou buf est le message a recevoir et length la taille du message.
Constructeur pour encapsuler un paquet UDP a envoyer :DatagramPacket(byte[] buf, int length, InetAddress
address, int port)
ou buf est le message a envoyer, length la taille du message,address est l’adresse IP destination et port est le port destination.
Attention le message buf doit etre initialise avant la construction dupaquet.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 13 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
La classe DatagramPacket : methodes de services
InetAddress getAddress()Retourne l’adresse IP de la machine distante.
int getPort()Retourne le numero de port distant.
byte[] getData()Retourne la partie donnee du paquet.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 14 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
Classe DatagramSocket
Constructeurs :
public DatagramSocket() throws SocketException
Creation d’un socket UDP associe a un port libre (prive)
public DatagramSocket(int port) throws SocketException
Creation d’un socket UDP associe au port port
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 15 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
DatagramSocket : Methodes de service
public void send(DatagramPacket p) throws IOException
Envoyer le paquet p
public void receive(DatagramPacket p) throws
IOException
recevoir un paquet p. L’appel ce cette methode est bloquante.
public void setSoTimeout(int timeout) throws
SocketException
Permet de debloquer le thread executant une methode recieve aubout de timeout seconds.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 16 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
Exemple : Envoie de message UDP (1)
/* Initialisation d’un socket UDP */
DatagramSocket socket = new DatgramSocket ()
/* identification de l’application destination : @IP; port */
InetAddress address =
InetAddress.getByName("iutv.univ -paris13.fr");
int port = 8888;
/* Le message a envoyer */
String s = new String ("Bonjour Paris 13");
byte[] message = new byte [1024];
/* transformation du message en suite d’octets */
message = s.getBytes ();
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 17 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
Exemple : Envoie de message UDP (2)
/* Formation du paquet UDP a envoyer */
DatagramPacket paquet =
new DatagramPacket(message ,longueur , address ,port );
/* envoi du paquet */
socket.send(paquet );
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 18 / 34
Classes Java pour la programmation reseaux: TCP/IP Classes pour communication UDP
Exemple : Reception de message UDP (1)
try {
DatagramSocket socket = new DatagramSocket (8888);
byte[] buffer = new byte [1024];
//On associe un paquet a un buffer vide pour la reception
DatagramPacket paquet =new
DatagramPacket(buffer ,buffer.length );
/* attente de reception */
socket.receive(paquet );
/* affichage du paquet recu */
String s = new String(buffer );
System.out.println("message recu : " + s);
} catch (Exception e) {}
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 19 / 34
Classes Java pour la programmation reseaux: TCP/IP Serveur UDP multi-threads
Serveur UDP multi-threads
Pourquoi ? Reduire le temps d’attente de traitement de requetes enpermettant le traitement parallele.
Comment ? Pour chaque paquet UDP recu par le serveur, un threadde traitement se charge du traitement du paquet.
Optimisation : Un serveur peut anticiper la creation de threads detraitement afin de reduire le temps d’attente de traitement d’unerequete.
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 20 / 34
Classes Java pour la programmation reseaux: TCP/IP Serveur UDP multi-threads
Serveur UDP multi-threads : Exemple
DatagramSocket socket = new DatagramSocket (8888);
while(true) {
byte[] buffer = new byte [1024];
DatagramPacket paquet =
newDatagramPacket(buffer ,buffer.length );
socket.receive(paquet );
/* Lancement d’un thread de traitement
a la reception d’un paquet */
new Handler(paquet ). start ();
/* se mettre a nouveau a attendre d’autres requetes */
}
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 21 / 34
Classes Java pour la programmation reseaux: TCP/IP Serveur UDP multi-threads
Serveur UDP multi-threads : Exemple
class Handler extends Thread {
private DatagramPacket p;
public Handler(DatagramPacket p) throws Exception {
if (p != null} {
this.p=p;
} else {
throw new Exception ();
}
public void run() {
/* traitement du paquet */
}
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 22 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication Multicast
Communication Multicast
Communication Multicast : Diffusion restreinte de messages au seind’un groupe.
Un groupe multicarte est identifie par une adresse IP de classe D.
Plage d’adresses de classe D (IPv4) : 224.0.0.1 - 239.255.255.255.
224.0.0.0 - 224.0.0.255 : adresses reservees pour des services systemes.224.0.0 - 238.255.255.255 : adresses publiques239.0.0.0 - 239.255.255.255 : adresses privees.
Utilisation d’un socket special : MulticastSocket
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 23 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication Multicast
La classe MulticastSocket
Sous-classe de DatagramSocket
Constructeurs :
public MulticastSocket () throws IOException
/* Creation d’un socket multicast associe
a un port UDP libre */
public MulticastSocket(int port) throws IOException
/* Creation d’un socket multicast associe
au port UDP port */
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 24 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication Multicast
La classe MulticastSocket
Quelques methodes de services :
public void joinGroup(InetAddress mcastaddr)
throws IOException
/* rejoindre un groupe de multicast */
public void leaveGroup(InetAddress mcastaddr)
throws IOException
/* Quitter un groupe de multicast */
public void setTimeToLive(int ttl)
throws IOException
/* Fixer le TTL associe aux paquets UDP */
public int getTimeToLive ()
throws IOException
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 25 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication Multicast
Multicast : exemple
public class Multicast {
public static void main(String [] args){
MulticastSocket soc;
InetAddress adr;
DatagramPacket p;
byte[] msg;
try{
adr = InetAddress.getByName("228.5.6.7");
soc = new MulticastSocket ();
soc.joinGroup(adr);
msg = new String("Salut!!"). getBytes ();
p= new DatagramPacket(msg , msg.length , adr , 8888);
soc.send(p);
}catch(Exception ex){}
}
} R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 26 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication Multicast
Multicast : exemple
public class MCClient {
public static void main(String [] args){
MulticastSocket soc;
InetAddress adr;
DatagramPacket p;
byte[] msg;
try{
adr = InetAddress.getByName("228.5.6.7");
soc = new MulticastSocket (8888);
soc.joinGroup(adr);
msg= new byte [1024];
p= new DatagramPacket(msg , msg.length );
soc.receive(p);
System.out.println("Message recu"+
new String(p.getData ()));
}catch(Exception ex){}
}}
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 27 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication TCP
Communication TCP
Communication en mode connecte
Communication en trois phases : connexion, echange, deconnexion.Controle d’erreurs et de perte de messages : mecanismesd’acquittements.
La phase de connexion est asymetrique. On parle alors de serveur etde client.
Le serveur TCP utilise un socket de la classe ServerSocket.
L’echange de messages se fait a travers de sockets de la classe Socket
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 28 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication TCP
La classe ServerSocket
Role : attendre la reception de demande de connexion. Puis creationd’un socket d’echange sur acceptation.
Constructeur :
public ServerSocket(int port)
throws IOException;
/* Creation d’un socket de connexion TCP associe
au port port*/
Metode d’acceptation de demande de connexion:
public Socket accept ()
throws IOException;
/* Attente de demande de connexion ,
creation s’un socket d’ echange apres acceptation */
l’appel de la methode accept() est bloquant
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 29 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication TCP
La classe Socket
Constructeur :
public Socket(InetAddress server , int port)
throws IOException;
/* Demande de connexion au serveur TCP
dont l’adresse est server et qui est
a l’ ecoute sur port */
Methode d’echange de donnees :
public InputStream getInputStream ();
/* renvoyer un flus d’entree pour lire les messages */
public OutputStream getOutputStream ();
/* renvoyer un flus d’entree pour l’envoi de
messages */
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 30 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication TCP
Serveur TCP : exemple
public class EchoServer {
public static void main(String [] args) {
ServerSocket serSoc;
DataInputStream in;
PrintStream out;
Socket soc;
try {
serSoc = new ServerSocket(Integer.parseInt(args [0]));
while(true) {
soc = serSoc.accept ();
in = new DataInputStream(soc.getInputStream ());
out = new PrintStream(soc.getOutputStream ());
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 31 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication TCP
Serveur TCP : exemple
while (true) {
String ligne=in.readLine ();
out.println("ECHO : "+ligne);
}
}
} catch (Exception e) { }
} }
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 32 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication TCP
Client TCP : exemple
public class EchoClient {
public static void main(String [] args) {
Socket soc;
DataInputStream in;
DataInputStream userInput;
PrintStream out;
String ligne;
try {
soc = new Socket(args[0], Integer.parseInt(args [1]));
in= new DataInputStream(soc.getInputStream ());
out = new PrintStream(soc.getOutputStream ());
userInput = new DataInputStream(System.in);
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 33 / 34
Classes Java pour la programmation reseaux: TCP/IP Communication TCP
Client TCP : exemple
while (true) {
ligne= userInput.readLine ();
if (ligne.equals("."))
break;
out.println(lingo);
System.out.println(in.readLine ());
}
}
catch (UnknownHostException e) { }
catch (IOException e) { } } }
R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 34 / 34