0% ont trouvé ce document utile (1 vote)
89 vues46 pages

03 Java Socket PDF

Transféré par

Erick Fotsiny
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (1 vote)
89 vues46 pages

03 Java Socket PDF

Transféré par

Erick Fotsiny
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Programmation réseau en java : les sockets

M. Belguidoum
Université Mentouri de Constantine
Département Informatique

M. Belguidoum (UMC) Programmation réseau 1 / 46


Plan

1 Rappel sur les entrées/sorties

2 Introduction et rappels sur les sockets

3 Socket en mode ux

4 Socket en mode datagram

5 Socket en mode multicast

6 Conclusion

M. Belguidoum (UMC) Programmation réseau 2 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties

lecture d'informations émises par une source externe, ou envoi


d'informations à une destination externe
sur le réseau, dans un chier du disque dur local, dans un autre
programme s'exécutant en parallèle, ou encore dans la mémoire.
en java les entrées sorties sont gérées par les objets de ux.

M. Belguidoum (UMC) Programmation réseau 3 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les ux


un ot est un canal de communication dans lequel les données sont
écrites ou lues de manière séquentielle.
un ux en lecture permet de lire les informations de manière
séquentielle.
un ux en écriture permet d'écrire les informations de manière
séquentielle.
les classes d'entrées/sorties sont dénies dans le paquetage [Link].
ceux qui manipulent des octets (InputStream, OutputStream et leurs
classes dérivées). Les ux binaires (octets) peuvent servir à charger en
mémoire des images, les enregistrer sur le disque ou enregistrer des
objets (procédé nommé sérialisation) ou les charger (désérialisation ).
ceux qui manipulent des caractères (Reader, Writer et leurs classes
dérivées), les caractères en java sont codés sur 16 bits (Unicode). Ces
ux servent à gérer les jeux de caractères (conversion, etc.).
Les classes InputStream, OutputStream, Reader et Writer sont
abstraites, c.a.d. qu'elles dénissent des méthodes communes à tout
leurs héritiers.
M. Belguidoum (UMC) Programmation réseau 4 / 46
Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les ux

M. Belguidoum (UMC) Programmation réseau 5 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les ux binaires

M. Belguidoum (UMC) Programmation réseau 6 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les ux caractères

M. Belguidoum (UMC) Programmation réseau 7 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les ux

Les classes d'entrées/sorties


Entrée Sortie
Binaire InputStream OutputStream
Texte Reader Writer
Les classes d'entrées/sorties les plus utilisées
Entrée Sortie
Binaire FileInputStream FileOutputStream
Texte BufferedReader, FileReader BufferedWriter, FileWriter
Les méthodes d'entrées/sorties les plus courantes
Entrée Sortie
Binaire read() write()
Texte readLine() println

M. Belguidoum (UMC) Programmation réseau 8 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les ux binaires

M. Belguidoum (UMC) Programmation réseau 9 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les chiers binaires

M. Belguidoum (UMC) Programmation réseau 10 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : les chiers texte

Pour écrire dans un chier, il faut disposer d'un ux d'écriture. On


peut utiliser la classe FileWriter ou la classe PrintWriter :
FileWriter(String fileName) : crée le chier de nom leName
PrintWriter(Writer out) : l'argument est de type Writer, c.a.d.
un ux d'écriture (dans un chier, sur le réseau,...)
Pour lire le contenu d'un chier, il faut disposer d'un ux de lecture
associé au chier. On peut utiliser pour cela la classe FileReader ou
BufferedReader :
FileReader(String nomFichier) : ouvre un ux de lecture à partir
du chier indiqué. Lance une exception si l'opération échoue.
BufferedReader(Reader in) : ouvre un ux de lecture buerisé à
partir d'un ux d'entrée in. Ce ux de type Reader peut provenir du
clavier, d'un chier, du réseau, ...

M. Belguidoum (UMC) Programmation réseau 11 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : E/S standard


Utiliser deux ux du type InputStream et OutputStream qui
s'appellent [Link] et [Link].
Le ux de données provenant du clavier est désigné par l'objet
[Link] de type InputStream. Il permet de lire des données
caractère par caractère.
Le type InputStream ne permet pas de lire d'un seul coup une ligne
de texte. Le type BufferedReader le permet avec la méthode
readLine().
import java . io .*;
public class Hello {
public static void main ( String [] args ) throws IOException
{
BufferedReader in =
new BufferedReader ( new InputStreamReader ( System . in ));
System . out . println ( " Entrez votre nom : " );
String name = in . readLine ();
System . out . println ( " Hello , "+ name );
} }
M. Belguidoum (UMC) Programmation réseau 12 / 46
Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : Flux entrants

M. Belguidoum (UMC) Programmation réseau 13 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : Flux sortants

M. Belguidoum (UMC) Programmation réseau 14 / 46


Rappel sur les entrées/sorties

Rappel sur les entrées/sorties : la sérialisation


Sérialisation : consiste à écrire des données présentes en mémoire
vers un ux de données binaires, c'est donc la représentation sous
forme binaire d'un objet Java
Utilisé pour échanger des objets (envoi d'objets, persistance, ...)
Ne marche qu'avec des Objets implantant l'interface serializable
Java a introduit des outils permettant de sérialiser les objets de
manière transparente et indépendante du système d'exploitation.
La sérialisation peut s'appliquer facilement à tous les objets.

M. Belguidoum (UMC) Programmation réseau 15 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets


Une socket represente un point de communication entre un processus
et un réseau.
Un processus client et un processus serveur, lorsqu'ils communiquent,
ouvrent donc chacun une socket.
A chaque socket est associé un port de connexion. Ces numéros de
port sont uniques sur un système donné, une application pouvant en
utiliser plusieurs (un serveur par exemple exploite une socket par client
connecté).
Un port est identié par un entier (16 bits).

M. Belguidoum (UMC) Programmation réseau 16 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets

Les ports numérotés de 0 à 511 sont les "well known ports" de


l'architecture TCP/IP. Ils donnent accès aux services standard de
l'interconnexion : transfert de chiers (FTP port 21), terminal (Telnet
port 23), courrier (SMTP port 25), serveur web (HTTP port 80)
De 512 à 1023, on trouve les services Unix.
Au delà, (1024 ...) ce sont les ports "utilisateurs" disponibles pour
placer un service applicatif quelconque.
Une connexion est identiée de façon unique par la donnée de deux
couples, une adresse IP et un numéro de port, un pour le client et un
autre pour le serveur.
Une communication client/serveur n'a pas forcément lieu via un
réseau. Il est en eet possible de faire communiquer un client et un
serveur sur une même machine, via l'interface de loopback,
représentée par convention par l'adresse IP [Link].
M. Belguidoum (UMC) Programmation réseau 17 / 46
Introduction et rappels sur les sockets

Rappels sur les sockets


Il existe deux modes de communication : suivant si elles sont
précédées ou pas d'une ouverture de communication et suivies ou pas
d'une fermeture
mode connecté : la communication entre un client et un serveur est
précédée d'une connexion et suivi d'une fermeture
Facilite la gestion d'état

Meilleurs contrôle des arrivées/départs de clients

Uniquement communication unicast

Plus lent au démarrage

mode non connecté : les messages sont envoyés librement


Plus facile à mettre en ÷uvre

Plus rapide au démarrage

la connexion au niveau transport 6= au niveau application


Mode couche transport couche application
Connecté TCP FTP, Telnet, SMTP, POP, JDBC

Non connecté UDP HTTP, NFS, DNS, TFTP

M. Belguidoum (UMC) Programmation réseau 18 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets

Une socket est donc identiée par


Une adresse IP : une des adresses de la machine
Un port : attribué automatiquement ou choisi par le programme

=> Adresse de Socket = Adresse IP + port

Une socket communique avec une autre socket via son adresse
Flux : une socket se connecte à une autre socket via son adresse de
socket
Datagram : une socket envoie/reçoit des données à/d'une autre
socket identiée par son adresse de socket

M. Belguidoum (UMC) Programmation réseau 19 / 46


Introduction et rappels sur les sockets

Rappels sur les sockets

Sockets en Java : uniquement orientée transport (couche 4)


Deux API pour les sockets
[Link] : API bloquante (abordée dans ce cours)
[Link] (> 1.4) : API non bloquante (pas abordée)

M. Belguidoum (UMC) Programmation réseau 20 / 46


Introduction et rappels sur les sockets

Principe de fonctionnement

le serveur enregistre son service sous un numéro de port, indiquant


le nombre de clients qu'il accepte de faire buériser à un instant T
(new serverSocket(...))
le serveur se met en attente d'une connexion (méthode accept()
de son instance de ServerSocket)
le client peut alors établir une connexion en demandant la création
d'une socket (new Socket()) à destination du serveur pour le port
sur lequel le service a été enregistré.
le serveur sort de son accept() et récupère une Socket de
communication avec le client
le client et le serveur peuvent alors utiliser des InputSteam et
OutputStream pour échanger les données

M. Belguidoum (UMC) Programmation réseau 21 / 46


Socket en mode ux

Socket en mode ux

Liaison par ux : Socket/ServerSocket (TCP)


Connecté : protocole de prise de connexion (lent), communication
uniquement point à point
Sans perte : un message arrive au moins un fois
Sans duplication : un message arrive au plus une fois
Avec fragmentation : les messages sont coupés
Ordre respecté : Communication de type téléphone

M. Belguidoum (UMC) Programmation réseau 22 / 46


Socket en mode ux

Socket en mode ux

M. Belguidoum (UMC) Programmation réseau 23 / 46


Socket en mode ux

TCP/IP : le serveur ([Link])

il utilise la classe [Link] pour accepter des


connexions de clients
quand un client se connecte à un port sur lequel un ServerSocket
écoute, ServerSocket crée une nouvelle instance de la classe Socket
pour supporter les communications côté serveur
int port =...;
ServerSocket server = new ServerSocket ( port );
Socket connection = server . accept ();

M. Belguidoum (UMC) Programmation réseau 24 / 46


Socket en mode ux

TCP/IP : le serveur ([Link])

les constructeurs et la plus part des méthodes peuvent générer une


IOException
la méthode accept() est dite bloquante ce qui implique de la mettre
dans une boucle innie qui se termine seulement si une erreur grave se
produit
final int PORT = ...;
try {
ServerSocket serveur = new ServerSocket ( PORT ,5);
while ( true ) {
Socket socket = serveur . accept ();
}
}
catch ( IOException e ){
... }

M. Belguidoum (UMC) Programmation réseau 25 / 46


Socket en mode ux

TCP/IP : le serveur ([Link])

Constructeur : n port
ServerSocket s = new ServerSocket (8080);

Méthodes principales
adresse IP : InetAddress getInetAddress()
port : int getLocalPort()
attente de connexion : Socket accept() méthode bloquante
fermeture : void close()
Options TCP : timeOut, receiveBufferSize

M. Belguidoum (UMC) Programmation réseau 26 / 46


Socket en mode ux

TCP/IP : le client ([Link])

le client se connecte au serveur en créant une instance de la classe


[Link] : connexion synchrone
String host = ...;
int port = ...;
Socket connection = new Socket ( host , port );

la socket permet de supporter les communications côté client


la méthode close() ferme (détruit) le socket
les constructeurs et la plupart des méthodes peuvent générer une
IOException
le serveur doit être démarré avant le client. Dans le cas contraire, si le
client se connecte à un serveur inexistant, une exception sera levée
après un time-out

M. Belguidoum (UMC) Programmation réseau 27 / 46


Socket en mode ux

TCP/IP : le client ([Link])

final String HOST = " ... ";


final int PORT = ...;
try {
Socket socket = new Socket ( HOST , PORT );
}
finally {
try { socket . close ();} catch ( IOException e ){}
}

M. Belguidoum (UMC) Programmation réseau 28 / 46


Socket en mode ux

TCP/IP : le client ([Link])

Constructeur : adresse + n° port


Socket s = new Socket (" www . lifl . fr " ,80);
Socket s = new Socket ( inetAddress ,8080);

Les méthodes principales


adresse IP : InetAddress getInetAddress(),
getLocalAddress()
port : int getPort(), getLocalPort()
ux in : InputStream getInputStream()
ux out : OutputStream getOutputStream()
fermeture : close()
Options TCP : timeOut, soLinger, tcpNoDelay, keepAlive

M. Belguidoum (UMC) Programmation réseau 29 / 46


Socket en mode ux

TCP/IP : le client ([Link])


Retrouver les adresses IP et les ports

M. Belguidoum (UMC) Programmation réseau 30 / 46


Socket en mode ux

TCP/IP : le ux de données

une fois la connexion réalisée, il faut obtenir les streams d'E/S


([Link]) auprès de l'instance de la classe Socket en cours
Flux entrant
obtention d'un stream simple : dénit les opérations de base
InputSteam in = [Link]();
création d'un stream convertissant les bytes reçus en char
InputSteamReader reader = new InputStreamReader(in);
création d'un stream de lecture avec tampon : pour lire ligne par ligne
dans un stream de caractères
BufferedReader istream = new BufferedReader(reader);
lecture d'une chaîne de caractères
String line = [Link]();

M. Belguidoum (UMC) Programmation réseau 31 / 46


Socket en mode ux

TCP/IP : le ux de données

Flux sortant
obtention du ot de données sortantes : bytes
OutputSteam out = socket . getOutputStream ();

création d'un stream convertissant les bytes en chaînes de caractères


PrintWriter ostream = new PrintWriter(out);
envoi d'une ligne de caractères [Link](str);
envoi eectif sur le réseau des bytes (important) [Link]();

M. Belguidoum (UMC) Programmation réseau 32 / 46


Socket en mode ux

TCP/IP : le ux de données

try {
Socket socket = new Socket ( HOST , PORT );
// Lecture du flux d ' entrée en provenance du serveur
InputStreamReader reader = new
InputStreamReader ( socket . getInputStream ());
BufferedReader istream = new BufferedReader ( reader );
String line = istream . readLine ();
// Echo la ligne lue vers le serveur
PrintWriter ostream = new PrintWriter ( socket . getOutputStream ());
ostream . println ( line );
ostream . flush ();
} catch ( IOException e) {...}
finally { try { socket . close ();} catch ( IOException e ){}}

M. Belguidoum (UMC) Programmation réseau 33 / 46


Socket en mode datagram

Socket en mode datagram

Liaison par datagram : DatagramSocket/DatagramPacket (UDP)


Non connecté : pas de protocole de connexion (plus rapide)
Avec perte : l'émetteur n'est pas assuré de la délivrance
Avec duplication : un message peut arriver plus d'une fois
Sans fragmentation : les messages envoyés ne sont jamais coupés :
soit un message arrive entièrement, soit il n'arrive pas
Ordre non respecté : Communication de type courrier

M. Belguidoum (UMC) Programmation réseau 34 / 46


Socket en mode datagram

Socket en mode datagram

M. Belguidoum (UMC) Programmation réseau 35 / 46


Socket en mode datagram

Socket en mode datagram

Il faut utiliser les classes DatagramPacket et DatagramSocket


Ces objets sont initialisés diéremment selon qu'ils sont utilisés pour
envoyer ou recevoir des paquets

M. Belguidoum (UMC) Programmation réseau 36 / 46


Socket en mode datagram

Socket en mode datagram : envoi d'un datagram

1 créer un DatagramPacket en spéciant :


les données à envoyer
leur longueur
la machine réceptrice et le port
2 utiliser la méthode send(DatagramPacket) de DatagramSocket
pas d'arguments pour le constructeur car toutes les informations se
trouvent dans le paquet envoyé

M. Belguidoum (UMC) Programmation réseau 37 / 46


Socket en mode datagram

Socket en mode datagram : envoi d'un datagram

// Machine destinataire
InetAddress address = InetAddress . getByName (" rainbow . essi . fr " );
static final int PORT = 4562;
// Création du message à envoyer
String s = new String (" Message à envoyer " );
int longueur = s. length ();
byte [] message = new byte [ longueur ];
// Initialisation du paquet avec toutes les informations
DatagramPacket paquet = new DatagramPacket ( message , longueur ,
address , PORT );
// Création du socket et envoi du paquet
DatagramSocket socket = new DatagramSocket ();
socket . send ( paquet );....

M. Belguidoum (UMC) Programmation réseau 38 / 46


Socket en mode datagram

Socket en mode datagram : réception d'un datagram

1 créer un DatagramSocket qui écoute sur le port de la machine du


destinataire
2 créer un DatagramPacket pour recevoir les paquets envoyés par le
serveur : dimensionner le buer assez grand
3 utiliser la méthode receive() de DatagramPacket : cette méthode
est bloquante

M. Belguidoum (UMC) Programmation réseau 39 / 46


Socket en mode datagram

Socket en mode datagram : réception d'un datagram

// Définir un buffer de réception


byte [] buffer = new byte [1024];
// On associe un paquet à un buffer vide pour la réception
DatagramPacket paquet = new
DatagramPacket ( buffer , buffer . length ());
// On crée un socket pour écouter sur le port
DatagramSocket socket = new DatagramSocket ( PORT );
while ( true ) {
// attente de réception
socket . receive ( paquet );
// affichage du paquet reçu
String s = new String ( buffer ,0 , paquet . getLength ());
System . out . println ( " Paquet reçu : " + s );
}

M. Belguidoum (UMC) Programmation réseau 40 / 46


Socket en mode datagram

Socket en mode datagram : [Link]

Constructeur
DatagramSocket ( port ) socket UDP sur port
DatagramSocket () socket UDP sur port qqconque

envoi : send(DatagramPacket)
réception : receive(DatagramPacket)
Options UDP : timeOut,...
remarque : possibilité de "connecter" une socket UDP à une (@IP,port)
connect ( InetAddress , int )

pas de connection réelle, juste un contrôle pour restreindre les


send/receive

M. Belguidoum (UMC) Programmation réseau 41 / 46


Socket en mode datagram

Socket en mode datagram : [Link]

Constructeur
DatagramPacket ( byte [] buf , int length )
DatagramPacket ( byte [] buf , int length , InetAddress , port )

getPort() : port de l'émetteur pour une réception ou port du


récepteur pour une émission
getAddress() : idem adresse
getData() : les données reçues ou à envoyer
getLength() : idem taille

M. Belguidoum (UMC) Programmation réseau 42 / 46


Socket en mode multicast

Socket en mode multicast

Muslticast IP : Diusion de messages vers un groupe de destinataires


messages émis sur une adresse
messages reçus par tous les récepteurs "écoutant" sur cette adresse
plusieurs émetteurs possibles vers la même adresse
les récepteurs peuvent rejoindre/quitter le groupe à tout instant
l'adresse IP de classe D (de [Link] à [Link])
indépendante de la localisation des émetteurs/récepteurs
Même propriétés que UDP : taille des messages limitée à 64 K, perte
de messages possible, pas de contrôle de ux, ordre des messages non
garanti,pas de connexion

M. Belguidoum (UMC) Programmation réseau 43 / 46


Socket en mode multicast

Socket en mode multicast

M. Belguidoum (UMC) Programmation réseau 44 / 46


Socket en mode multicast

Socket en mode multicast


API : [Link]
Constructeur
MulticastSocket ( port ) sur # port
MulticastSocket () sur port qqconque
( + ... )

envoi : send(DatagramPacket)
réception : receive(DatagramPacket)
se lier à un groupe : joinGroup(InetAddress)
quitter un groupe : leaveGroup(InetAddress)
Limiter la portée des messages multicast : en xant le TTL
(setTimeToLive(int), le nombre de routeurs que le paquet peut
traverser avant d'être arrêté
0 : ne dépasse pas la machine
1 : ne dépasse pas le réseau local
127 : monde entier
M. Belguidoum (UMC) Programmation réseau 45 / 46
Conclusion

Bibliographie

APPRENTISSAGE DU LANGAGE JAVA, Serge Tahé - ISTIA -


Université d'Angers, juin 2002
basé sur les cours de : Gaël Thomas, Lionel Seinturier, Karima
Boudaoud, etc.
Kenneth L. Calvert, Michael J. Donahoo, TCP/IP Sockets in Java,
pratical for programmers
tutorial socket : [Link]
networking/sockets/[Link]
la paquetage [Link] :
[Link]

M. Belguidoum (UMC) Programmation réseau 46 / 46

Vous aimerez peut-être aussi