Vous êtes sur la page 1sur 36

Programmation Socket en

Java
Cours sockets
Universit Paul Sabatier
83
Plan
! Un bon rflexe
! Les adresses IP en Java
! Sockets en mode flot
La classe Socket
La classe ServerSocket
Communication via les Sockets
Fermeture dune Socket
Client Socket en mode flot
Serveur Socket en mode flot
! Sockets en mode datagramme
La classe DatagramSocket
Communication via les Sockets
Fermeture dune Socket
Client Socket en mode datagramme
Serveur Socket en mode datagramme
84
Un bon rflexe
! Usez et Abusez de laide en ligne Java :
http://java.sun.com
! Contient les classes Java :
Les interfaces
Les constructeurs
Les mthodes de la classe
Les classes filles et parent

85
Informations diverses
! Le principe est proche des sockets C
! Lutilisation des fonctionnalits rseau
de Java ncssite limportation de
java.net.ce_dont_vous_avez_besoin;
86
Les adresses IP en Java 1/4
! Reprsents par la classe java.net.InetAddress
! Contient 2 champs :
hostName
Stocke le nom de lhte (ex: www.monsite.com)
address
Stocke ladresse IP de lhte
! Pas de constructeurs publics.
Pour crer une InetAddress, il faut utiliser une des mthodes
suivantes :
public static InetAddress getByName(String nom_hote)
public static InetAddress [] getAllByName(String
nom_hote)
public static InetAddress getLocalHost()
87
Les adresses IP en Java 2/4
! public static InetAddress getByName
(String nom_hote)
! Cette mthode utilise le DNS pour renvoyer une instance de
la classe InetAddress contenant ladresse IP de la
machine dont le nom est pass en paramtre
! En cas derreur, lve lexception UnknownHostException
! Exemple :
InetAddress adr =
InetAddress.getbyName(www.site.com);
88
Les adresses IP en Java 3/4
! public static InetAddress getByName []
(String nom_hote)
Renvoie toutes les adresses IP de la machine (dont le nom
est pass en paramtre)
En cas derreur, lve lexception UnknownHostException
! public static InetAddress getLocalHost ()
Renvoie une instance de la classe InetAddress
contenant ladresse IP de la machine locale
En cas derreur, lve lexception UnknownHostException
quivalent :
getByName(null)
getByName("localhost")
89
Les adresses IP en Java 4/4
! public String getHostName ()
Renvoie la chaine de caractres contenant le nom de la
machine locale
Renvoie ladresse IP de la machine si elle na pas de nom
! public byte [] getAddress ()
Renvoie ladresse IP de la machine locale sous forme de
tableau doctets rangs selon lordre rseau
Le premier octet contient loctet de poids fort de ladresse
! Remarque :
La manipulation doctets non signs pose problme en Java
car il ny a pas dquivalent au type C unsigned char. Les
octets suprieurs 127 sont donc traits comme des
nombres ngatifs !
Pour rcuprer les bonnes valeurs :
int octetNonSigne = octet < 0 ? octet + 256 : octet;
90
Sockets en mode flot
! Utilisation de TCP (dans ce cours )
! Principe :
Cration des sockets
Positionnement des flux dentre et de sortie
! Une fois les flux dentre et de sortie lis, le
principe est IDENTIQUE :
Une saisie au clavier pour la rception
Un affichage lcran pour lenvoi
On peut utiliser des mthodes standards !
91
Socket en mode flot (client)
Cration de la socket
Si chec
Attachement de la socket
Construction de ladresse du serveur
Demande de connexion
Envoi/Rception de donnes
via la socket
Fermeture de la socket
Si OK
92
La classe Socket 1/5
! Socket en mode flot (TCP)
! Reprsente les sockets clients ou les sockets de service
! Constructeurs :
public Socket (String hote, int port)
throws UnknownHostException, IOException
Cre un socket et tente de sy connecter.
Lve les exceptions :
UnkownHostException = si le nom de la machine est inconnu
IOException = pour la plupart des autres raisons:
Lhte refuse la connexion
Problme de connexion
Erreur de routage des paquets
Paramtres :
String hote = chaine de caractre contenant le nom de lhte
int port = port de destination (port auquel la socket doit se connecter)
Exemple :
Socket laSocket = new Socket(www.site.com), 47);
93
La classe Socket 2/5
constructeurs suite
! public Socket (InetAddress addresse,
int port)
throws IOException
Cre un socket et tente de sy connecter.
Lve lexception IOException
Paramtres :
InetAddress adresse = InetAddress contenant
ladresse de lhte
int port = port de destination (port auquel la
socket doit se connecter)
94
La classe Socket 3/5
constructeurs suite
! public Socket(String hote, int port,
InetAddress addresseLocale,
int portLocal)
throws IOException
Analogue au constructeur Socket(String hote, int port)
Les deux derniers paramtres permettent de choisir linterface rseau
(et le port) do doit partir la connexion
Lve lexception IOException
Paramtres :
String hote = chaine de caractre contenant le nom de lhte
int port = port de destination (port auquel la socket doit se connecter)
InetAddress adresseLocale = InetAddress contenant ladresse
locale partir de laquelle la connexion doit se faire
int portLocal = port local (port partir duquel la socket doit se
connecter)
95
La classe Socket 4/5
constructeurs suite
! public Socket(InetAddress address, int port,
InetAddress addresseLocale,
int portLocal)
throws IOException
Analogue au constructeur Socket(InetAddress address, int port)
Les deux derniers paramtres permettent de choisir linterface
rseau (et le port) do doit partir la connexion
Lve lexception IOException
Paramtres :
InetAddress adresse = InetAddress contenant ladresse de lhte
int port = port de destination (port auquel la socket doit se connecter)
InetAddress adresseLocale = InetAddress contenant ladresse
locale partir de laquelle la connexion doit se faire
int portLocal = port local (port partir duquel la socket doit se
connecter)
96
La classe Socket 5/5
constructeurs suite
! protected Socket()
! Et protected Socket(SocketImpl impl)
throws SocketException
Constructeurs protgs
Cre un socket MAIS ne tente pas de
connexion
Souvent employ pour implanter des sockets
au comportement personnalis (chiffrement,
proxy)
97
La classe Socket 6/8
mthodes
! Rception dun flux dinformation dune Socket
Java TCP
public InputStream getInputStream()
throws IOException
Cette mthode permet de rcuprer le flux en provenance
dune socket
Il faut lier ce flux un lecteur !
Exemple InputStreamReader, BufferedReader
Conseil : lier lInputStream un flux offrant de meilleures
fonctionnalits comme DataInputStream par exemple
Exemple :
DataInputStream flux_in = new
DataInputStream(chaussette.getInputStream));
98
La classe Socket 7/8
mthodes suite
! Envoi dinformations dans une Socket Java TCP :
public OutputStream getOutputStream()
throws IOException
Cette mthode permet de rcuprer le flux en sortie vers
une socket
Il faut lier ce flux un writer !
Exemple PrintStream
Conseil : lier lOutputStream un flux offrant de meilleures
fonctionnalits comme PrintStream par exemple
Exemple :
PrintStream flux_out = new
PrintStream(chaussette.getOutputStream));
99
La classe Socket 8/8
mthodes suite
! Fermeture de la Socket
public void close() throws IOException
Mme si Java ferme les sockets la fin du
programme (ou via le Garbage collect), il est DE
BON USAGE de fermer EXPLICITEMENT les
socket via la mthode close.
Valable pour tous les types de Sockets
Sockets de service
Sockets clients
Sockets serveurs (ServerSockets)
100
Exemple de programme client
(non complet)
import java.io.*;
import java.net.*;
public class ClientEcho extends Object {
public static void main (String args[]) {
String reponse;
Socket leSocket;
PrintStream fluxSortieSocket;
BufferedReader fluxEntreeSocket;
try {
// creation dune socket et connexion la machine marine sur le port 7
leSocket = new Socket("marine.edu.ups-tlse.fr", 7);
System.out.println("Connect sur : "+leSocket);
// cration dun flux de type PrintStream li au flux de sortie de la socket
fluxSortieSocket = new PrintStream(leSocket.getOutputStream());
// creation dun flux BufferedReader li au flux dentre de la socket
fluxEntreeSocket = new BufferedReader(new
InputStreamReader(leSocket.getInputStream()));
// envoi de donnes vers le serveur
fluxSortieSocket.println("Bonjour le monde!");
// attente puis rception de donnes du serveur
reponse = fluxEntreeSocket.readLine();
System.out.println("Reponse du serveur : " + reponse);
leSocket.close();
} // try
catch (UnknownHostException ex)
{
System.err.println("Machine inconnue : "+ex);
ex.printStackTrace();
}
catch (IOException ex)
{
System.err.println("Erreur : "+ex);
ex.printStackTrace();
}
} // main
} // class
101
Socket en mode flot (serveur)
Cration de la socket
ou
Attachement de la socket dcoute
Ouverture du service
Attente dune demande de connexion
et cration dune socket de service
Envoi/Rception de donnes
via la socket de service
Fermeture de la socket de service Fermeture de la socket dcoute
ou
102
La classe ServerSocket 1/4
! Reprsente les sockets serveurs (Sockets dcoute)
! Constructeurs :
public ServerSocket (int port)
throws IOException
Cre un socket serveur qui attendra une connexion sur le port
pass en paramtre
Lve lexception IOException
Notamment si le port choisi est dj pris
Ou si le port choisi est well-known (valeur < 1024) et vous ntes
pas super-utilisateur
Paramtre :
int port = port dcoute
Si la valeur est 0, le systme alloue dynamiquement le port
(solution PEU conseille pour un serveur)
Exemple :
ServerSocket s_Serveur = new ServerSocket(47);
103
La classe ServerSocket 2/4
constructeurs suite
! public ServerSocket (int port, int tailleFile)
throws IOException
Analogue au prcdent
Permet de prciser la longueur de la file dattente des requtes de
connexion
Si la file est pleine et quune connexion arrive, elle est refuse.
Lve lexception IOException
Notamment si le port choisi est dj pris
Ou si le port choisi est well-known (valeur < 1024) et vous ntes pas
super-utilisateur
Paramtres :
int port = port dcoute
Si la valeur est 0, le systme alloue dynamiquement le port (solution PEU
conseille pour un serveur)
int tailleFile = taille de la file dattente de connexions entrantes
Par dfaut fix 50
Plafonne la limite du systme
104
La classe ServerSocket 3/4
constructeurs suite
! public ServerSocket (int port, int tailleFile,
InetAddress adresseLocale)
throws IOException
Analogue au prcdent
Permet de prciser ladresse IP laquelle attendre des
connexions si la machine locale en possde plusieurs
Lve lexception IOException
Paramtres :
int port = port dcoute
Si la valeur est 0, le systme alloue dynamiquement le port
(solution PEU conseille pour un serveur)
int tailleFile = taille de la file dattente de connexions
entrantes
InetAddress adresseLocale = adresse IP o attendre les
connexions
Cette adresse doit appartenir la machine locale
105
La classe ServerSocket 4/4
mthodes
! Accepter une connexion entrante
public Socket accept() throws IOException
Bloque lexcution du serveur dans lattente dune connexion
entrante
Renvoie un objet Socket lorsque la communication est
tablie
Note :
Pour ne pas bloquer lexcution du programme par le accept,
le placer dans un thread spcifique
! Fermer la socket
Identique la mthode de la classe Socket
106
Exemple de programme serveur
(non complet)
import java.io.*;
import java.net.*;
public class ServeurEcho extends Object {
public static void main (String args[]) {
ServerSocket socketEcoute;
Socket socketService;
InputStream entreeSocket;
OutputStream sortieSocket;
try {
// cration du socket dcoute (port numro 7)
socketEcoute = new ServerSocket(7);
while (true) {
// attente dune demande de connexion
socketService = socketEcoute.accept();
System.out.println("Nouvelle connexion : " + socketService);
// rcupration des flux dentre/sortie de la socket de service
entreeSocket = socketService.getInputStream();
try {
int b = 0;
while (b != -1) {
b = entreeSocket.read();
sortieSocket.write(b);
} // while
System.out.println("Fin de connexion");
} // try
catch (IOException ex)
{
// fin de connexion
System.out.println("Fin de connexion : "+ex);
ex.printStackTrace();
}
socketService.close();
} // while (true)
} // try
catch (Exception ex)
{
// erreur de connexion
System.err.println("Une erreur est survenue : "+ex);
ex.printStackTrace();
}
} // main
} // class
107
EXERCICE :
! crire un programme client permettant
dinterroger un serveur daytime dont
ladresse est fournie en paramtre
! crire un programme serveur de type
daytime.
108
Sockets en mode datagramme
(UDP)
! Chaque processus doit crer une socket
et lutilise pour envoyer (ou attendre et
recevoir) des donnes
! Manipulation de datagrammes
" Via les objets DatagramPacket
109
La classe DatagramSocket 1/2
! Permet de crer et manipuler des sockets UDP
! Constructeurs :
public DatagramSocket()
throws SocketException
Cre un socket UDP permettant lenvoi et la rception
de datagrammes.
Lve lexception SocketException :
Si il y a un problme de configuration rseau
Un problme de port

Attention :
Avec ce constructeur, le systme attribue lui-mme le port
110
La classe DatagramSocket 2/2
! Constructeurs :
public DatagramSocket (int port)
throws SocketException
Analogue au prcdent
Permet de choisir le port UDP
Lve lexception SocketException
Paramtre :
int port = port
Si la valeur est 0, le systme alloue dynamiquement le port
public DatagramSocket (int port, InetAddress adresse)
throws SocketException
Analogue au prcdent
Mais permet en plus de choisir ladresse IP lie au port
Lve lexception SocketException
Paramtre :
int port = port
InetAddress adresse = adresse IP utilise par la socket UDP
111
La classe DatagramPacket 1/3
! Permet de manipuler les datagrammes changs entre les
correspondants
! Constructeurs :
public DatagramPacket (byte[] tampon, int lg)
Cre un objet employ pour la rception dun datagramme
Paramtres :
byte[] tampon = tableau doctets permettant la rception des
donnes
ATTENTION : Si la taille du tableau est insuffisante, les
donnes seront tronques
int lg = taille du tableau (ou des donnes recevoir)
Exemple :
byte[] tampon = new byte[1024];
DatagramPacket datagramme = new DatagramPacket(tampon,
tampon.length);
112
La classe DatagramPacket 2/3
! Constructeurs :
public DatagramPacket (byte[] tampon, int lg,
InetAddress adresse,
int port)
Cre un objet employ pour lenvoi dun datagramme
Paramtres :
byte[] tampon = tableau doctets contenant les donnes
envoyer
int lg = taille du tableau (ou des donnes envoyer)
InetAddress adresse = adresse o envoyer le datagramme
int port = port de destination
Exemple :
String message = coucou !!! ;
byte[] tampon = message.getBytes();
InetAddress adresse =
InetAddress.getByName(moncorrepsondant.fr);
DatagramPacket datagramme = new DatagramPacket(tampon,
tampon.length, adresse, 45848);
113
La classe DatagramPacket 3/3
Emission/Rception de datagrammes
! Mthodes :
public void send (DatagramPacket p)
throws IOException
Envoie un datagramme pass en paramtre
Lve lexception IOException en cas derreur
Paramtres :
DatagramPacket p = datagramme prt lenvoi
public void receive (DatagramPacket p)
throws IOException
Attends la rception dun datagramme et remplie la datagramme
pass en paramtre par les donnes reues
Lve lexception IOException en cas derreur
Paramtres :
DatagramPacket p = datagramme vide prt recevoir les
donnes
114
Fermeture de la Socket UDP
! public void close() throws IOException
Mme si Java ferme les DatagramSocket la fin du
programme (ou via le Garbage collect), il est DE BON
USAGE de fermer EXPLICITEMENT les
DatagramSockets via la mthode close une fois
quils ne sont plus utiles.
115
Exemple de programme denvoi
de datagrammes (non complet)
import java.net.*;
import java.io.*;
class EnvoiDatagramme
{
public static void main(String argv[]) throws SocketException, IOException, UnknownHostException
{
String message = "Bonjour le monde!";
byte[] tampon = ligne.getBytes();
InetAddress adresse = null;
DatagramSocket socket;
// recupre ladresse IP de la machine marine
adresse = InetAddress.getByName("marine.edu.ups-tlse.fr");
// cre lobjet qui stockera les donnes du datagramme envoyer
DatagramPacket envoi= new DatagramPacket(tampon,tampon.length,adresse,50000);
// cre un socket UDP (le port est choisi par le systme)
socket=new DatagramSocket();
// envoie le datagramme UDP
socket.send(envoi);
}
}
116
Exemple de programme de
rception de datagrammes (non
complet)
import java.net.*;
import java.io.*;
class ReceptionDatagramme
{
public static void main(String argv[]) throws SocketException, IOException
{
byte[] tampon = new byte[1000];
String texte;
// cre un socket UDP qui attends des datagrammes sur le port 50000
DatagramSocket socket =new DatagramSocket(50000);
// cre un objet pour stocker les donnes du datagramme attendu
DatagramPacket reception = new DatagramPacket(tampon, tampon.length);
// attends puis rcupre les donnes du datagramme
socket.receive(reception);
// rcupre la chane de caractre reue
// Note: reception.getLength() contient le nombre doctets reus
texte=new String(tampon, 0, reception.getLength());
System.out.println("Reception de la machine "+ reception.getAddress().getHostName()+" sur le port"
+reception.getPort() + " :\n"+texte );
}
}
117
EXERCICE :
! crire un programme client permettant
dinterroger un serveur daytime dont
ladresse est fournie en paramtre
! crire un programme serveur de type
daytime.