34
Introduction ` a la programmation de clients/serveur TCP/IP en Java Rushed Kanawati LIPN, CNRS UMR 7030 Universit´ e Paris 13 http://lipn.fr/kanawati [email protected] December 17, 2012 R. Kanawati (LIPN) Programmation r´ eseau en java December 17, 2012 1 / 34

Introduction à la programmation de clients/serveur TCP/IP

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introduction à la programmation de clients/serveur TCP/IP

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

Page 2: Introduction à la programmation de clients/serveur TCP/IP

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

Page 3: Introduction à la programmation de clients/serveur TCP/IP

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

Page 4: Introduction à la programmation de clients/serveur TCP/IP

Introduction

Rappel : Architecture Logicielle TCP/IP

R. Kanawati (LIPN) Programmation reseau en java December 17, 2012 4 / 34

Page 5: Introduction à la programmation de clients/serveur TCP/IP

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

Page 6: Introduction à la programmation de clients/serveur TCP/IP

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

Page 7: Introduction à la programmation de clients/serveur TCP/IP

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

Page 8: Introduction à la programmation de clients/serveur TCP/IP

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

Page 9: Introduction à la programmation de clients/serveur TCP/IP

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

Page 10: Introduction à la programmation de clients/serveur TCP/IP

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

Page 11: Introduction à la programmation de clients/serveur TCP/IP

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

Page 12: Introduction à la programmation de clients/serveur TCP/IP

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

Page 13: Introduction à la programmation de clients/serveur TCP/IP

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

Page 14: Introduction à la programmation de clients/serveur TCP/IP

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

Page 15: Introduction à la programmation de clients/serveur TCP/IP

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

Page 16: Introduction à la programmation de clients/serveur TCP/IP

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

Page 17: Introduction à la programmation de clients/serveur TCP/IP

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

Page 18: Introduction à la programmation de clients/serveur TCP/IP

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

Page 19: Introduction à la programmation de clients/serveur TCP/IP

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

Page 20: Introduction à la programmation de clients/serveur TCP/IP

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

Page 21: Introduction à la programmation de clients/serveur TCP/IP

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

Page 22: Introduction à la programmation de clients/serveur TCP/IP

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

Page 23: Introduction à la programmation de clients/serveur TCP/IP

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

Page 24: Introduction à la programmation de clients/serveur TCP/IP

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

Page 25: Introduction à la programmation de clients/serveur TCP/IP

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

Page 26: Introduction à la programmation de clients/serveur TCP/IP

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

Page 27: Introduction à la programmation de clients/serveur TCP/IP

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

Page 28: Introduction à la programmation de clients/serveur TCP/IP

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

Page 29: Introduction à la programmation de clients/serveur TCP/IP

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

Page 30: Introduction à la programmation de clients/serveur TCP/IP

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

Page 31: Introduction à la programmation de clients/serveur TCP/IP

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

Page 32: Introduction à la programmation de clients/serveur TCP/IP

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

Page 33: Introduction à la programmation de clients/serveur TCP/IP

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

Page 34: Introduction à la programmation de clients/serveur TCP/IP

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