Académique Documents
Professionnel Documents
Culture Documents
CHAPITRE 3
Les Sockets
Le terme socket signifie douille, prise électrique sur quoi on branche quelque chose.
Une socket est un point d'extrémité d'une liaison de communication bidirectionnelle entre deux
programmes s'exécutant sur le réseau.
Pour faciliter leur utilisation, les sockets sont conçues en respectant la sémantique des E/S du système :
2, Lecture/Ecriture : ‘’Envoi
Et réception.’’
NIVEAUX D’ABSTRACTION
Présentation
RPC Session
Socket: Envoi de messages.
Socket
Transport
RPC: Appel de procédures.
Réseau
Java RMI: Invocation de méthodes.
Liaison
SOAP: Envoi de services.
Physique
LES SOCKETS EN JAVA
SOCK_STREAM
SOCK_DGRAM
COMMUNICATION BASÉE SUR LES SOCKETS
1.’’Le serveur commence par créer ServerSocket 4.‘’ Le serveur crée une nouvelle socket
pour recevoir les demandes de connexion.’’ qui sera l’une des extrémités de la connexion.’’
2.’’Le serveur se met en attente 5.‘’ Le client obtient la socket qui est la
des demandes de connexion.’’ deuxième extrémité de la connexion.’’
3.‘’ Le client demande une connexion 6.‘’ Le client et le serveur créent les
Serveur
à travers le port associé au service.’’ Entrées et sorties associées ServerSocket(port)
aux deux sockets.’’
Socket(‘Serveur’,port)
ServerSocket: server
Client server.accept() App S
Socket : s
App C is Socket : s
os is
s.getInputStream os
s.getInputStream
s.getOutputStream
s.getOutputStream
COMMUNICATION BASÉE SUR LES SOCKETS
1.’’Le serveur commence par créer une ServerSocket 4.‘’ Le serveur crée une nouvelle socket
pour recevoir les demandes de connexion.’’ qui sera l’une des extrémités de la connexion.’’
2.’’Le serveur se met en attente 5.‘’ Le client obtient la socket qui est la
des demandes de connexion.’’ deuxième extrémité de la connexion.’’
3.‘’ Le client demande une connexion 6.‘’ Le client et le serveur créent les Serveur
à travers le port associé au service.’’ entrées et sorties associées
aux deux sockets.’’
ServerSocket: ss
Client ss.accept() App S
Socket : s
App C is Socket : s
os is
is.read() os
os.write(…) is.read()
os.write(…)
JAVA.NET
Le package java.net fournit les classes pour l'implémentation des applications réseau.
o Les adresses, qui sont des identifiants de réseau, comme les adresses IP.
o Les sockets, qui sont des mécanismes de communication de données bidirectionnels de base.
La classe java.net.InetAddress permet de manipuler des adresses IP. Dans le cas le plus simple, cette
classe est utilisée pour connaître l'adresse IP à partir d'un nom d'hôte, et vice-versa.
o Exemple:
InetAddress adrLocale= InetAddress.getLocalHost();
System.out.println("Adresse locale: " + adrLocale.getHostAddress());
System.out.println("Nom: " + id.getHostName());
JAVA.NET.INETADDRESS
o Exemple :
o Exemple :
InetAddress [] adrServeurs= InetAddress.getAllByName("www.sun.com");
for (int i=0; i<adrServeurs.length;i++)
{
System.out.println("Adresse Serveur: "+ i +"= "+adrServeurs[i].getHostAddress());
}
JAVA.NET.INETADDRESS
byte[] getAddress() Retourne l'adresse internet stockée dans l'objet sous forme d'un tableau de 4
octets dans l'ordre réseau.
o Exemple :
Si l’on souhaite créer un serveur, la première chose à créer est l’objet ServerSocket
appartenant à la classe ServerSocket.
Un objet ServerSocket est un objet qui permet d’ouvrir un service d’écoute sur le
réseau (il écoute le réseau) et attend qu’un client demande une connexion.
Implante un objet du type Socket qui prend en charge la transmission des données.
CLASSE JAVA.NET.SERVERSOCKET
o Constructeurs :
ser:ServerSocket
port : 1122
CLASSE JAVA.NET.SERVERSOCKET
o Méthodes :
ser:ServerSocket
port : 1122
accept():Socket
CLASSE JAVA.NET.SOCKET
Contient les méthodes de création des flux d'entrée et de sortie. Les sockets
constituent la base des communications par le réseau.
CLASSE JAVA.NET.SOCKET
o Constructeurs :
Socket(String host, int port)
‘’Construit une nouvelle Socket. Le nom et le port
sont fournis en paramètres.’’
o Exceptions :
UnknownHostException ‘’si la machine hôte
n’existe pas.’’
o Méthodes :
o Méthodes :
InetAddress getLocalAddress() ‘’
adresse de la machine hôte.’’
La communication sur une connexion par socket utilise la notion de flots de données :
‘’java.io.InputStream’’ ‘’java.io.OutputStream’’
o Méthode :
InputStream i = socket.getInputStream();
OutputStream o = socket.getOutputStream();
ser:ServerSocket
int entree=i.read();
Int rep= ……; port : 1122
o.write(rep);
accept():Socket
socket:Socket
read
i getInputStream()
o getOutputStream()
write
Client Serveur
InputStream i = socket.getInputStream();
InputStream i = socket.getInputStream(); OutputStream o = socket.getOutputStream();
OutputStream o = socket.getOutputStream();
ser:ServerSocket
int entree=i.read();
o.write(….); Int rep= ……; port : 1122
int rep=i.read(); o.write(rep);
System.out.println(rep); accept():Socket
connexion
socket:Socket socket:Socket
read
getInputStream() o i getInputStream()
getOutputStream() i o getOutputStream()
write
EXEMPLE 1 (CONNEXION AU SERVEUR)
public static void main(String[] args) throws IOException { public static void main(String[] args) throws
//Création de l'objet Serveur UnknownHostException, IOException {
}
EXEMPLE 2 (MANIPULATION D’UN NOMBRE)
8. Envoi du résultat.
EXEMPLE 2 (MANIPULATION D’UN NOMBRE)
Serveur Client
Lecture Ecriture
Type primitif Lecture Ecriture
InputStream OutputStream
Integer readInt() writeInt()
read():int write(int var)
Float readFloat() writeFloat()
Serveur Client
ServerSocket ser= new ServerSocket(1122); System.out.println(‘’Je me connecte au serveur");
System.out.println("Waiting for a client"); Socket socket= new Socket("localhost",1122);
Socket socket =ser.accept();
System.out.println("Client connecté"); DataInputStream i = new
DataInputStream(socket.getInputStream());
DataInputStream i = new DataOutputStream o = new
DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream());
DataOutputStream o = new
DataOutputStream(socket.getOutputStream()); Scanner scanner = new Scanner(System.in);
System.out.println(‘’Donner un nombre : ");
System.out.println("Attente d’un nombre du client"); Int nombre = scanner.nextInt();
int nombre = i.readInt(); System.out.println(‘’J’envoi le nombre: "+ nombre + " au
System.out.println("J’ai reçu le nombre du client" + serveur");
nombre); o.writeInt(nombre);
int resultat = nombre*10; System.out.println(‘’J’attends la réponse du serveur");
System.out.println("J’envoi le résultat" + resultat); Int reponse=i.readInt();
o.writeInt(resultat); System.out.println(‘’J’ai reçu la réponse: "+ reponse );
COMMUNICATION PAR FLOTS DE CARACTÈRES
Lecture Ecriture
InputStream OutputStream
read():int write(int c)
InputStreamReader PrintWriter
read():int println(String s)
BufferedReader
readLine():String
COMMUNICATION PAR FLOTS DE CARACTÈRES
Exelmple
public static void main(String[] args) throws IOException public static void main(String[] args) throws
{ UnknownHostException, IOException {
ServerSocket server = new ServerSocket(1015); Socket socket = new Socket ("localhost", 1015);
System.out.println("Waiting for a connection");
Socket socket = server.accept();
System.out.println("Connected"); PrintWriter pw = new PrintWriter
(socket.getOutputStream(),true);
InputStreamReader isr= new
InputStreamReader(socket.getInputStream()); pw.println("Hello Server");
BufferedReader bf = new BufferedReader(isr);
String st = bf.readLine(); }
TCP_NODELAY :
faux :
boolean on=true;
socket.setTcpNoDelay(on);
faux : la socket est fermée immédiatement, et les paquets non envoyés sont perdus.
CLASSE JAVA.NET.SOCKET (OPTIONS)
Exemple :
int timeout=90;
socket.setSoLinger(true,timeout);
SO_TIMEOUT:
La valeur du délai d'attente doit être supérieure à 0, sinon une erreur sera
générée.
CLASSE JAVA.NET.SOCKET (OPTIONS)
Exemple :
int timeout=90987789;
socket.setSoTimeout(timeout);
o Constructeur :
DatagramSocket(int port)
o Méthodes :
void send(DatagramPacket p) int getLocalPort()
‘’ Pour l’émission des paquets. ‘’retourne le port sur lequel on écoute,
IOException’’ ou le port anonyme sur lequel on a envoyé
le paquet.’’
o Constructeurs :
o Méthodes :
byte[] getData() int getLength()
‘‘Renvoie le tampon de données.’’ ‘’retourne la taille du tableau des données
reçues.’’
InetAddress getAddress()
int getPort() ‘’retourne le port de l’hôte
‘’retourne l’adresse de l’hôte d’où
qui a envoyé, ou vers lequel on envoie.’’
vient ou où va le paquet.’’
void setPort(int port)
void setAddress(InetAddress ia) ’‘change le port vers lequel on envoie le
‘’change l’adresse où envoyer le paquet.’’ paquet.’’
EXEMPLE : ENVOI DE PAQUETS UDP AU SERVEUR
Serveur Client
//Création d’une socket pour écouter sur le port //Création d’une socket
DatagramSocket ds=new DatagramSocket(1122); DatagramSocket ds=new DatagramSocket();
Processus 1 Processus 2
} catch (IOException e) {
o La socket est transmise à la classe pour qu’elle
puisse communiquer avec le client.
e.printStackTrace();
}
}
class communication extends Thread {
private Socket socket;
public communication (Socket s) {
this.socket=s;
}
public void run() { }
}
}
Serveur
class communication extends Thread { La création des streams se fait dans la méthode run().
private Socket socket;
public communication (Socket s) { Une fois le thread démarré, il entre dans une boucle de
this.socket=s; communication (lecture et écriture) :
}
while (true) {
String reader =bf.readLine();
pw.println(reader.length());
}
}
}
package exemple; class communication extends Thread {
private Socket socket;
import java.io.BufferedReader; private int numclient;
import java.io.IOException; public communication (Socket s, int num ) {
import java.io.InputStreamReader; this.socket=s;
import java.io.PrintWriter; this.numclient=num;
import java.net.ServerSocket; }
import java.net.Socket;
public void run() {
public class ServerMT extends Thread {
try {
private int nbreclients; InputStreamReader isr = new InputStreamReader
(socket.getInputStream());
public static void main(String[] args) { BufferedReader bf = new BufferedReader(isr);
new ServerMT().start(); PrintWriter pw = new PrintWriter
} (socket.getOutputStream(),true);
System.out.println("Connexion du client: "+numclient);
public void run() { pw.println("Bienvenue, voux êtes le client numéro:
try { "+numclient+ " , dites quelque chose: ");
ServerSocket server= new ServerSocket (1122); while (true) {
while (true) { String reader =bf.readLine();
Socket socket = server.accept(); pw.println(reader.length());
++nbreclients; }
new communication(socket, nbreclients ).start();
} } catch (IOException e) {