SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
Introduction aux
sockets
Par SoftDeath
www.siteduzero.com
Licence Creative Commons 2 2.0
Dernière mise à jour le 15/05/2012
Sommaire
2Sommaire ...........................................................................................................................................
1Lire aussi ............................................................................................................................................
3Introduction aux sockets ....................................................................................................................
4Récupérer une adresse IP avec InetAddress ...................................................................................................................
5Qu'est-ce qu'un socket ? ...................................................................................................................................................
8Échange de message .......................................................................................................................................................
11Côté Serveur .............................................................................................................................................................................................................
11Côté Client .................................................................................................................................................................................................................
11Utilisation des threads ...............................................................................................................................................................................................
13TP : un mini-chat entre le client et le serveur ! ................................................................................................................
22Q.C.M. .............................................................................................................................................................................
23Partager .....................................................................................................................................................................................................................
2/24
www.siteduzero.com
Introduction aux sockets
Par SoftDeath
Mise à jour : 15/05/2012
Difficulté : Difficile
1 536 visites depuis 7 jours, classé 91/797
Bienvenue dans mon tout premier mini-tutoriel consacré auxsockets en langage Java. On ne va pas tout apprendre sur les
sockets mais étudier le plus important concernant ces classes du répertoire java.net.
Avant de vous lancer dans la lecture de ce tutoriel, les deuxpremières parties de cysboy sur le langage Java ainsi que la
lecture de celui sur les threads et les fluxd'entrées et sorties (1/2) sont primordiales pour bien suivre le cours !
Je vous recommande également de lire le chapitre de Dalshim Bien fermer ses threads en Java si vous voulez bien maîtriser la
fermeture de vos threads.
Les sockets servent à communiquer entre deuxhôtes appelés Client / Serveur à l'aide d'une adresse IP et d'un port que j'appelle
prise ; ces sockets permettront de gérer des fluxentrant et sortant afin d'assurer une communication entre les deux(le client et le
serveur), soit de manière fiable à l'aide du protocole TCP/IP, soit non fiable mais plus rapide avec le protocole UDP. Nous allons
étudier le premier mode, le mode TCP/IP…
Voici ce qu'on peut réaliser à l'aide des sockets :
des jeuxen ligne ;
des systèmes distribués ;
des espaces messengers comme MSN Messenger, Yahoo Messenger, … ;
des applications comme BitComet permettant de gérer les fichiers .torrent que vous connaissez ;
et bien d'autres choses.
Les sockets sont utilisés dans plusieurs autres langages, tels que :
le langage C : ( lien vers un tutoriel) ;
le langage C++ : (lien vers un autre tutoriel) ;
le langage PHP : (lien vers un troisième tutoriel) ;
l'Action Script : (aller lire le tutoriel) ;
le Erlang : (lien vers le tuto concerné) ;
et bien d'autres.
Lire les parties « histoire » et « définitions » de tutoriels ci-dessus ne vous fera pas de mal.
Ne tardons pas et commençons.
Sommaire du tutoriel :
Récupérer une adresse IP avec InetAddress
Qu'est-ce qu'un socket ?
Échange de message
TP : un mini-chat entre le client et le serveur !
Q.C.M.
Sommaire 3/24
www.siteduzero.com
Récupérer une adresse IP avec InetAddress
Le package java.net de la plate-forme Java fournit une classe InetAddress qui nous permet de récupérer et manipuler son adresse
internet, IP pour les intimes. Cette classe n'a pas de constructeur, pour pouvoir avoir une instance de cette classe on a besoin
des méthodes de classe. Voici les méthodes dont je vous parle :
getLocalHost() : elle retourne un objet qui contient l'adresse IP de la machine locale.
getByName(String nom_de_l_machine) : elle retourne un objet qui contient l'adresse IP de la machine dont le nom est
passé en paramètre.
getAllByName(String nom_de_l_machine) : elle retourne un tableau d'objets qui contient l'ensemble d'adresses IP de la
machine qui correspond au nom passé en paramètre.
A présent, voyons les méthodes applicables à un objet de cette classe :
getHostName() : elle retourne le nom de la machine dont l'adresse est stockée dans l'objet.
getAddress() : elle retourne l'adresse IP stockée dans l'objet sous forme d'un tableau de 4 octets.
toString() : elle retourne un String qui correspond au nom de la machine et son adresse.
Et pour terminer un petit exemple :
Code : Java
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Adressage {
public static void main(String[] zero) {
InetAddress LocaleAdresse ;
InetAddress ServeurAdresse;
try {
LocaleAdresse = InetAddress.getLocalHost();
System.out.println("L'adresse locale est : "+LocaleAdresse );
ServeurAdresse= InetAddress.getByName("www.siteduzero.com");
System.out.println("L'adresse du serveur du
site du zéro est : "+ServeurAdresse);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
Et le résultat est :
Code : Console
L'adresse locale est : softdeath/239.254.78.177
L'adresse du serveur du site du zéro est : www.siteduzero.com/80.248.219.123
Introduction aux sockets 4/24
www.siteduzero.com
Fastoche, hein ?
La classe InetAdress peut lever une exception de type UnknownHostException, tâchez de ne pas l'oublier !
Nous savons maintenant comment récupérer l'adresse IP de notre machine ou d'une machine distante, que diriez-vous si l'on
l'utilisait pour créer notre tout premier socket ? C'est parti
Qu'est-ce qu'un socket ?
Un socket est un point de terminaison d'une communication bidirectionnelle, c'est-à-dire entre un client et un serveur en cours
d'exécution sur un réseau donné. Les deuxsont liés par un même numéro de port TCP de sorte que la couche puisse identifier la
demande de partage de données.
Un serveur fonctionne sur une machine bien définie et est lié à un numéro de port spécifique. Le serveur se met simplement à
l'écoute d'un client, qui demande une connexion.
En outre, java.net comprend la classe ServerSocket, qui met en oeuvre une sorte de prise que les serveurs peuvent utiliser pour
écouter et accepter les connexions des clients. Ce qui nous donne :
Code : Java
ServerSocket socketserver = new ServerSocket(numero_port);
Ainsi on obtient un objet de la classe ServerSocket sur un port spécifique : si ce dernier est à 0, le socket est créée sur n'importe
quel port libre.
Il existe deuxautres constructeurs ; l'un a deuxparamètres, le premier est bien sûr le numéro de port et le nombre total de
connexion simultanées acceptées, voyez :
Code : Java
ServerSocket socketserver = new ServerSocket(numer_port,nbr_max);
nbr_max est le nombre maximal de connexions traitées simultanément. Par exemple au-delà de cinq tentatives de connexion
consécutives autorisées, les connexions sont refusés.
Introduction aux sockets 5/24
www.siteduzero.com
Pour le second constructeur il suffit de spécifier l'adresse locale du serveur.
Code : Java
ServerSocket socketserver = new
ServerSocket(numer_port,nbr_max,adresse_locale);
Quant au client, celui-ci connaît le nom de la machine sur laquelle le serveur est en exécution et le numéro de port sur lequel il
écoute. Le client va demander une connexion au serveur en s'identifiant avec son adresse IP ainsi que le numéro de port qui lui
est lié.
Pour cela, le package java.net fournit une classe Socket qui met en œuvre une connexion bidirectionnelle entre votre programme
Java et un autre programme situé sur le réseau. La classe Socket permet de cacher les détails d'implémentation de cette
connexion. En utilisant cette classe en lieu et place d'un code natif, vos programmes peuvent communiquer sur le réseau quel
que soit la plateforme sur laquelle ils se trouvent. La création d'un socket pour un programme client s'effectue à l'aide d'un des
constructeurs suivants :
Code : Java
Socket socket = new Socket(param1, param2)
Le premier paramètre correspond à l'identité du client, il peut être une chaine de caractère ou de type InetAddress, param2
correspond au numéro de port sur lequel on souhaite se connecter sur le serveur. Il est possible également de spécifier son
adresse local comme troisième paramètre et le numéro de port local :
Code : Java
Socket socket = new Socket(adresse_distante, port_distant,
adresse_locale, port_locale)
Après tentative de connexion, si tout va bien, le serveur accepte la connexion du client, et reçoit un nouveau socket qui est
directement lié au même port local. Il a besoin d'une nouvelle prise de sorte qu'elle puisse continuer à écouter le socket d'origine
pour les demandes de connexion, tout t'en satisfaisant les besoins du client connecté. Voici comment accepter une connexion
d'un client :
Code : Java
Socket socketduserveur = socketserver.accept();
Une fois le socket créé, l'attente de connexion provenant du client se fait à l'aide de la méthode accept().
La méthode accept() reste bloquante tant qu'elle n'a pas détecté de connexion.
Afin d'éviter une attente infinie, il est possible de spécifier un délai maximal d'attente à l'aide d'un mutateur setSoTimeout.
Si un timeout est une valeur strictement positive, l'appel accept() va générer une attente maximale égale à timeout. Si ce temps
expire, une exception de type InterruptedIOException est levée sans toute fois que la socket de type ServerSocket ne soit
invalidée. La lecture de ce timeout se fait à l'aide de l'accesseur getSoTimeout().
Côté client, si la connexion est acceptée, une socket est créé et le client peut utiliser la socket pour communiquer avec le serveur.
Introduction aux sockets 6/24
www.siteduzero.com
L'établissement d'une connexion peut lever une exception de type IOException.
On va essayer d'établir une communication. Vous avez tout les éléments à portée de main, vous pouvez désormais établir une
connexion, au boulot !
...Ce n'était pas si difficile que ça, voyons la correction
Le client et le serveur peuvent à présent communiquer par l'écriture ou la lecture de leurs prises.
Secret (cliquez pour afficher)
Serveur.java
Code : Java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Serveur {
public static void main(String[] zero) {
ServerSocket socketserver ;
Socket socketduserveur ;
try {
socketserver = new ServerSocket(2009);
socketduserveur = socketserver.accept();
System.out.println("Un zéro s'est connecté !");
socketserver.close();
socketduserveur.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
Client.java
Code : Java
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] zero) {
Socket socket;
try {
socket = new Socket(InetAddress.getLocalHost(),2009);
socket.close();
}catch (UnknownHostException e) {
Introduction aux sockets 7/24
www.siteduzero.com
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
Lancez le serveur en premier et ensuite le client !
Vous venez d'établir votre première connexion entre un serveur et un client . Maintenant, voyons comment envoyer et
recevoir des messages.
Attention : il ne faut jamais oublier de fermer le socket ! Sinon si vous utilisez le même port dans un autre programme, ce
(l'action de fermer une socket) ne sera plus possible car il (le port) sera occupé !
Échange de message
Une fois la connexion établie et les sockets en possession, il est possible de récupérer le fluxd'entrée et de sortie de la connexion
TCP vers le serveur. Il existe deuxméthodes pour permettre la récupération des flux:
getInputStream() de la classe InputStream. Elle nous permet de gérer les fluxentrant ;
getOutputStream() de la classe OuputStream. Elle nous permet de gérer les fluxsortant.
Ces deuxméthodes nous permettent donc de gérer les fluxen entrée et en sortie. En général le type d'entrée et sortie utilisé est
BufferedReader et InputStreamReader pour la lecture, PrintWriter pour l'écriture. Mais on peut utiliser tous les autres flux.
En se basant sur l'annexe du tuto Java :
BufferedReader : cette classe permet de lire des caractères à partir d'un fluxtamponné, afin de faire des lectures plus
rapides ;
InputStreamReader : convertit un fluxbinaire en fluxde caractères : elle convertit un objet de type InputStream en objet
de type Reader ;
PrintWriter : la classe PrintWriter ajoute à un fluxla possibilité de faire des écritures sous forme de texte des types
primitifs Java, et des chaînes de caractères.
Un petit exemple de communication en image et en code source :
Introduction aux sockets 8/24
www.siteduzero.com
Serveur.java
Code : Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.PrintWriter;
public class Serveur {
public static void main(String[] zero) {
ServerSocket socketserver ;
Socket socketduserveur ;
BufferedReader in;
PrintWriter out;
try {
socketserver = new ServerSocket(2009);
System.out.println("Le serveur est à l'écoute du port
"+socketserver.getLocalPort());
socketduserveur = socketserver.accept();
System.out.println("Un zéro s'est connecté");
out = new PrintWriter(socketduserveur.getOutputStream());
out.println("Vous êtes connecté zéro !");
out.flush();
socketduserveur.close();
socketserver.close();
}catch (IOException e) {
Introduction aux sockets 9/24
www.siteduzero.com
e.printStackTrace();
}
}
}
Client.java
Code : Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] zero) {
Socket socket;
BufferedReader in;
PrintWriter out;
try {
socket = new Socket(InetAddress.getLocalHost(),2009);
System.out.println("Demande de connexion");
in = new BufferedReader (new InputStreamReader
(socket.getInputStream()));
String message_distant = in.readLine();
System.out.println(message_distant);
socket.close();
}catch (UnknownHostException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
Résultat chez le serveur :
Code : Console
Le serveur est à l'écoute du port 2009
Un zéro s'est connecté
Résultat chez le client :
Introduction aux sockets 10/24
www.siteduzero.com
Code : Console
Demande de connexion
Vous êtes connecté zéro !
Ho là ! Un instant ! C'est quoi, ces encapsulations et ce flush ?
Rassurez-vous, on va tout expliquer en détail ( ), surtout ne vous affolez pas.
Côté Serveur
Après établissement de la connexion, le serveur obtient son socket qu'il utilise pour gérer le fluxsortant à l'aide de
socketduserveur.getOutputStream() ; ensuite, à l'aide de la méthode println on envoie un message au client, on utilise flush
pour vider le buffer tout simplement. Et pour finir on ferme la connexion.
Côté Client
Après avoir obtenu notre socket, on utilise socket.getInputStream() pour récupérer le fluxsortant. La méthode readLine() nous
permet de lire une chaîne de caractères. Il existe plusieurs autres méthodes telles :
readInt() permettant de lire un entier ;
readDouble() permettant de lire un nombre de type double ;
…
Pour finir, on affiche le message reçu et on ferme notre socket.
Ça a l'air très simple à première vue pour deuxhôtes, mais si l'on veut que plus que deuxpuissent communiquer entre euxà la
fois, comment faire ? D'où la nécessité d'utiliser les Threads.
Utilisation des threads
Je pars du principe que vous connaissez ce que sont les threads et comment les utiliser et pourquoi doit-on les utiliser dans nos
programme, on va donc attaquer directement la pratique.
Le principe d'utilisation des Threads est simple (sera simple si vous suivez attentivement :D).Après avoir créer un objet
ServerSocket par le serveur, on le place (l'objet) comme paramètre à un constructeur de la classe qui implémente la classe
Runnable ou étend la classe Thread, dès qu'un client souhaite se connecter avec le serveur, un Thread s'occupe de la
connexion, il ne sera plus la peine de faire appel au serveur lorsqu'un client souhaite se connecter, tout le boulot sera confié à un
Thread.
Vous commencez à comprendre l'utilité des Threads avec le temps vous ne pourrez plus vous en passer.
Voyons un petit exemple de connexion Multi-Threads en image et avec un code source toujours :
Introduction aux sockets 11/24
www.siteduzero.com
Serveur.java
Code : Java
import java.io.IOException;
import java.net.*;
public class Serveur {
public static void main(String[] zero){
ServerSocket socket;
try {
socket = new ServerSocket(2009);
Thread t = new Thread(new Accepter_clients(socket));
t.start();
System.out.println("Mes employeurs sont prêts !");
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Accepter_clients implements Runnable {
private ServerSocket socketserver;
private Socket socket;
private int nbrclient = 1;
public Accepter_clients(ServerSocket s){
socketserver = s;
}
public void run() {
try {
while(true){
socket = socketserver.accept(); // Un client se connecte on
l'accepte
System.out.println("Le client numéro "+nbrclient+
" est connecté !");
nbrclient++;
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
Introduction aux sockets 12/24
www.siteduzero.com
}
}
}
Client.java
Code : Java
import java.io.IOException;
import java.net.*;
public class Client {
public static void main(String[] zero){
Socket socket;
try {
socket = new Socket("localhost",2009);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Résulats :
Code : Console
Mes employeurs sont prêts !
Le client numero 1 est connecté !
Le client numero 2 est connecté !
Le client numero 3 est connecté !
Si vous m'avez bien suivis vous ne devriez pas avoir du mal à comprendre ce code. Dès que quelqu'un tape à la porte, on
demande à un employer de lui ouvrir la porte, celui-là va le saluer et lui dire bye bye avec socket.close(); s'il ne veut pas parler
(communiquer) .
TP : un mini-chat entre le client et le serveur !
À présent que nous savons su manier les sockets en utilisant les threads, réalisons un petit programme client / serveur : après la
connexion du client, celui-ci devra s'authentifier en premier, le serveur va vérifier dans un fichier la validité de ses données ; si
tout est O.K., un message lui dira qu'il est connecté, ils pourront ensuite envoyer tous leurs messages au serveur. Voilà : très
simple.
On devra avoir quelque chose de ce genre côté serveur, pour plusieurs clients à la fois :
Code : Console
Le serveur est à l'écoute du port 2009
Un zéro veut se connecter
softdeath vient de se connecter
softdeath : salut, M. le serveur, j'ai besoin de vos services.
Introduction aux sockets 13/24
www.siteduzero.com
Un zéro veut se connecter
chabanus vient de se connecte
chabanus : salut, j'ai besoin d'accéder à telles données.
et du côté du client, tête-à-tête avec le serveur après connexion :
Code : Console
Demande de connexion
Connexion établie avec le serveur, authentification :
Entrez votre login :
chabanus
Entrez votre mot de passe :
chabanus
Je suis connecté
Votre message :
salut
Le serveur vous dit : salut
Votre message :
ça va ?
Le serveur vous dit : bien et toi ?
Allez au boulot !
…
…
…
… J'espère que vous avez au moins essayé.
Cette solution n'est ni unique ni la meilleure, elle est simple et minimale pour vous montrer comment les threads doivent être
gérés.
Voyons la correction :
Côté Serveur
Secret (cliquez pour afficher)
Accepter_connexion.java
Code : Java
import java.io.*;
import java.net.*;
public class Accepter_connexion implements Runnable{
private ServerSocket socketserver = null;
private Socket socket = null;
public Thread t1;
public Accepter_connexion(ServerSocket ss){
socketserver = ss;
}
public void run() {
try {
while(true){
socket = socketserver.accept();
System.out.println("Un zéro veut se connecter ");
Introduction aux sockets 14/24
www.siteduzero.com
t1 = new Thread(new Authentification(socket));
t1.start();
}
} catch (IOException e) {
System.err.println("Erreur serveur");
}
}
}
Authentification .java
Code : Java
import java.net.*;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.io.*;
public class Authentification implements Runnable {
private Socket socket;
private PrintWriter out = null;
private BufferedReader in = null;
private String login = "zero", pass = null;
public boolean authentifier = false;
public Thread t2;
public Authentification(Socket s){
socket = s;
}
public void run() {
try {
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
while(!authentifier){
out.println("Entrez votre login :");
out.flush();
login = in.readLine();
out.println("Entrez votre mot de passe :");
out.flush();
pass = in.readLine();
if(isValid(login, pass)){
out.println("connecte");
System.out.println(login +" vient de se connecter ");
out.flush();
authentifier = true;
}
else {out.println("erreur"); out.flush();}
}
t2 = new Thread(new Chat_ClientServeur(socket,login));
t2.start();
} catch (IOException e) {
System.err.println(login+" ne répond pas !");
}
Introduction aux sockets 15/24
www.siteduzero.com
}
}
private static boolean isValid(String login, String pass) {
boolean connexion = false;
try {
Scanner sc = new Scanner(new File("zero.txt"));
while(sc.hasNext()){
if(sc.nextLine().equals(login+" "+pass)){
connexion=true;
break;
}
}
} catch (FileNotFoundException e) {
System.err.println("Le fichier n'existe pas !");
}
return connexion;
}
}
Chat_ClientServeur.java
Code : Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Chat_ClientServeur implements Runnable {
private Socket socket = null;
private BufferedReader in = null;
private PrintWriter out = null;
private String login = "zero";
private Thread t3, t4;
public Chat_ClientServeur(Socket s, String log){
socket = s;
login = log;
}
public void run() {
try {
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
Thread t3 = new Thread(new Reception(in,login));
t3.start();
Thread t4 = new Thread(new Emission(out));
t4.start();
} catch (IOException e) {
System.err.println(login +"s'est déconnecté ");
}
}
}
Introduction aux sockets 16/24
www.siteduzero.com
Emission .java
Code : Java
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Emission implements Runnable {
private PrintWriter out;
private String message = null;
private Scanner sc = null;
public Emission(PrintWriter out) {
this.out = out;
}
public void run() {
sc = new Scanner(System.in);
while(true){
System.out.println("Votre message :");
message = sc.nextLine();
out.println(message);
out.flush();
}
}
}
Reception.java
Code : Java
import java.io.BufferedReader;
import java.io.IOException;
public class Reception implements Runnable {
private BufferedReader in;
private String message = null, login = null;
public Reception(BufferedReader in, String login){
this.in = in;
this.login = login;
}
public void run() {
while(true){
try {
message = in.readLine();
System.out.println(login+" : "+message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Introduction aux sockets 17/24
www.siteduzero.com
}
Serveur.java
Code : Java
import java.io.*;
import java.net.*;
public class Serveur {
public static ServerSocket ss = null;
public static Thread t;
public static void main(String[] args) {
try {
ss = new ServerSocket(2009);
System.out.println("Le serveur est à l'écoute du port
"+ss.getLocalPort());
t = new Thread(new Accepter_connexion(ss));
t.start();
} catch (IOException e) {
System.err.println("Le port "+ss.getLocalPort()+" est déjà
utilisé !");
}
}
}
Côté Client
Secret (cliquez pour afficher)
Chat_ClientServeur.java
Code : Java
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Chat_ClientServeur implements Runnable {
private Socket socket;
private PrintWriter out = null;
private BufferedReader in = null;
private Scanner sc;
private Thread t3, t4;
public Chat_ClientServeur(Socket s){
socket = s;
}
public void run() {
try {
Introduction aux sockets 18/24
www.siteduzero.com
out = new PrintWriter(socket.getOutputStream());
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
sc = new Scanner(System.in);
Thread t4 = new Thread(new Emission(out));
t4.start();
Thread t3 = new Thread(new Reception(in));
t3.start();
} catch (IOException e) {
System.err.println("Le serveur distant s'est déconnecté !");
}
}
}
Client.java
Code : Java
import java.io.*;
import java.net.*;
public class Client {
public static Socket socket = null;
public static Thread t1;
public static void main(String[] args) {
try {
System.out.println("Demande de connexion");
socket = new Socket("127.0.0.1",2009);
System.out.println("Connexion établie avec le serveur,
authentification :"); // Si le message s'affiche c'est que je
suis connecté
t1 = new Thread(new Connexion(socket));
t1.start();
} catch (UnknownHostException e) {
System.err.println("Impossible de se connecter à l'adresse
"+socket.getLocalAddress());
} catch (IOException e) {
System.err.println("Aucun serveur à l'écoute du port
"+socket.getLocalPort());
}
}
}
Connexion.java
Code : Java
Introduction aux sockets 19/24
www.siteduzero.com
import java.net.*;
import java.util.Scanner;
import java.io.*;
public class Connexion implements Runnable {
private Socket socket = null;
public static Thread t2;
public static String login = null, pass = null, message1 = null,
message2 = null, message3 = null;
private PrintWriter out = null;
private BufferedReader in = null;
private Scanner sc = null;
private boolean connect = false;
public Connexion(Socket s){
socket = s;
}
public void run() {
try {
out = new PrintWriter(socket.getOutputStream());
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
sc = new Scanner(System.in);
while(!connect ){
System.out.println(in.readLine());
login = sc.nextLine();
out.println(login);
out.flush();
System.out.println(in.readLine());
pass = sc.nextLine();
out.println(pass);
out.flush();
if(in.readLine().equals("connecte")){
System.out.println("Je suis connecté ");
connect = true;
}
else {
System.err.println("Vos informations sont incorrectes ");
}
}
t2 = new Thread(new Chat_ClientServeur(socket));
t2.start();
} catch (IOException e) {
System.err.println("Le serveur ne répond plus ");
}
}
}
Emission.java
Code : Java
Introduction aux sockets 20/24
www.siteduzero.com
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Emission implements Runnable {
private PrintWriter out;
private String login = null, message = null;
private Scanner sc = null;
public Emission(PrintWriter out) {
this.out = out;
}
public void run() {
sc = new Scanner(System.in);
while(true){
System.out.println("Votre message :");
message = sc.nextLine();
out.println(message);
out.flush();
}
}
}
Reception.java
Code : Java
import java.io.BufferedReader;
import java.io.IOException;
public class Reception implements Runnable {
private BufferedReader in;
private String message = null;
public Reception(BufferedReader in){
this.in = in;
}
public void run() {
while(true){
try {
message = in.readLine();
System.out.println("Le serveur vous dit :" +message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Introduction aux sockets 21/24
www.siteduzero.com
Lancez serveur.java et ensuite client.java, n'oubliez pas de créer un fichier pour le serveur pour qu'il puisse y vérifier l'identité de
ses clients, je l'ai nommé zero.txt : vous pouvez le nommer comme vous le souhaitez, c'est à votre guise.
Optimisation :
Pour ne pas dire qu'il en existe à l'infini, plusieurs autres possibilités s'offrent à vous, vous pouvez :
rendre l'application client / client. Le serveur authentifie les deuxclients et ces deux-là pourront discuter ensemble sans
que d'autres puissent y entrer : grosso modo réaliser un « salon », comme on l'appelle ;
utiliser les bases de données pour la sauvegarde des messages et pour authentifier les clients ;
réaliser une interface graphique en swing ou en awt ;
…
Croyez-moi : lorsque vous maîtriserez les sockets en utilisant les threads, rien ne sera plus compliqué pour vous. Bonne
continuation à tous ; surtout n'hésitez pas à l'améliorer et envoyez-moi un MP pour m'exposer votre travail.
Q.C.M.
Le premier QCM de ce cours vous est offert en libre accès.
Pour accéder auxsuivants
Connectez-vous Inscrivez-vous
Quelle est la classe qui permet de créer un socket pour le serveur ?
SocketServer.
ServeurSocket.
SocketServeur.
ServerSocket.
Un client peut créer plusieurs sockets.
Vrai.
Faux.
Qu'est-ce qui cloche dans ce code ?
Code : Java
try {
ServerSocket ss= new ServerSocket(1026);
ss.close();
Socket s = ss.accept();
} catch (IOException e) {
}
On a oublié d'utiliser les threads.
On doit d'abord instancier un objet Socket avant ServerSocket.
On a coupé l'écoute du serveur avant d'accepter les clients.
On devrait mettre 2009 à la place de 1026.
Le port 1026 est un port réservé.
Correction !
Statistiques de réponses au QCM
Le mode UDP est plus rapide que le mode TCP mais c'est une communication non fiable, car on ne se préoccupe pas du résultat
de la réception du récepteur, il est donc moins utilisé. Maintenant que vous savez manier les sockets, le mode UDP ne devrait
pas vous poser de problème .
Introduction aux sockets 22/24
www.siteduzero.com
Je vous remercie d'avoir lu le tutoriel, il est à présent terminé. J'espère que vous avez bien suivi
À la prochaine pour un autre tutoriel client/serveur ! La technologie RMI (Remote Method Invocation) ! Qui vous permettra de
mieuxcomprendre la nature et la fonction des EJB (Entreprise JavaBeans) qui représente l'étendard de la plate-forme J2EE !
Je remercie :
Le membre cysboy pour m'avoir encouragé.
Les validateurs Xavinou, Coyote et Thunderseb.
Le zCorrecteur Poulpette pour avoir pris le temps de corriger le tutoriel.
Enfin, tout le staff du site du zéro qui nous permet de rédiger des tutoriels pour débutants.
Partager
Ce tutoriel a été corrigé par les zCorrecteurs.
Introduction aux sockets 23/24
www.siteduzero.com

Contenu connexe

Tendances

Rapport application chat
Rapport application chatRapport application chat
Rapport application chatTbatou sanae
 
Authentification par certificat (clear box)
Authentification par certificat (clear box)Authentification par certificat (clear box)
Authentification par certificat (clear box)Ousmane BADJI
 
Cours 2 les architectures reparties
Cours 2 les architectures repartiesCours 2 les architectures reparties
Cours 2 les architectures repartiesMariem ZAOUALI
 
Equipements d'interconnexion
Equipements d'interconnexionEquipements d'interconnexion
Equipements d'interconnexionInes Kechiche
 
Notions de base sur le routage
Notions de base sur le routageNotions de base sur le routage
Notions de base sur le routageInes Kechiche
 
Introduction aux réseaux locaux
 Introduction aux réseaux locaux Introduction aux réseaux locaux
Introduction aux réseaux locauxInes Kechiche
 
Mise en place de deux réseaux LAN interconnectés par un réseau WAN
Mise en place de deux réseaux LAN interconnectés par un réseau WANMise en place de deux réseaux LAN interconnectés par un réseau WAN
Mise en place de deux réseaux LAN interconnectés par un réseau WANGhassen Chaieb
 
4 protocole de redondance(hsrp-vrrp-glbp)
4 protocole de redondance(hsrp-vrrp-glbp)4 protocole de redondance(hsrp-vrrp-glbp)
4 protocole de redondance(hsrp-vrrp-glbp)medalaa
 
Chapitre 6 - Protocoles TCP/IP, UDP/IP
Chapitre 6  - Protocoles TCP/IP, UDP/IPChapitre 6  - Protocoles TCP/IP, UDP/IP
Chapitre 6 - Protocoles TCP/IP, UDP/IPTarik Zakaria Benmerar
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Heithem Abbes
 
Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)EL AMRI El Hassan
 

Tendances (20)

Rapport projet final system reparti
Rapport projet final system repartiRapport projet final system reparti
Rapport projet final system reparti
 
Rapport application chat
Rapport application chatRapport application chat
Rapport application chat
 
Authentification par certificat (clear box)
Authentification par certificat (clear box)Authentification par certificat (clear box)
Authentification par certificat (clear box)
 
Cours 2 les architectures reparties
Cours 2 les architectures repartiesCours 2 les architectures reparties
Cours 2 les architectures reparties
 
Equipements d'interconnexion
Equipements d'interconnexionEquipements d'interconnexion
Equipements d'interconnexion
 
Notions de base sur le routage
Notions de base sur le routageNotions de base sur le routage
Notions de base sur le routage
 
Introduction aux réseaux locaux
 Introduction aux réseaux locaux Introduction aux réseaux locaux
Introduction aux réseaux locaux
 
Mise en place de deux réseaux LAN interconnectés par un réseau WAN
Mise en place de deux réseaux LAN interconnectés par un réseau WANMise en place de deux réseaux LAN interconnectés par un réseau WAN
Mise en place de deux réseaux LAN interconnectés par un réseau WAN
 
4 protocole de redondance(hsrp-vrrp-glbp)
4 protocole de redondance(hsrp-vrrp-glbp)4 protocole de redondance(hsrp-vrrp-glbp)
4 protocole de redondance(hsrp-vrrp-glbp)
 
Chapitre 6 - Protocoles TCP/IP, UDP/IP
Chapitre 6  - Protocoles TCP/IP, UDP/IPChapitre 6  - Protocoles TCP/IP, UDP/IP
Chapitre 6 - Protocoles TCP/IP, UDP/IP
 
Projet MQTT
Projet MQTTProjet MQTT
Projet MQTT
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)
 
Les Vpn
Les VpnLes Vpn
Les Vpn
 
Vpn
VpnVpn
Vpn
 
Le protocole stp
Le protocole stpLe protocole stp
Le protocole stp
 
Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)Connexion point à point (ppp, hdlc)
Connexion point à point (ppp, hdlc)
 
Commutation
CommutationCommutation
Commutation
 
Exposer reseaux haut débit
Exposer reseaux haut débitExposer reseaux haut débit
Exposer reseaux haut débit
 
Ethernet
EthernetEthernet
Ethernet
 
mis en place dun vpn site à site
mis en place dun vpn site à site mis en place dun vpn site à site
mis en place dun vpn site à site
 

En vedette

Programmation des Threads en java
Programmation des Threads en javaProgrammation des Threads en java
Programmation des Threads en javaEzéquiel Tsagué
 
Cours java avance avancé thread arraylist
Cours java avance avancé thread arraylistCours java avance avancé thread arraylist
Cours java avance avancé thread arraylistHoussem Hamrouni
 
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...Riadh K.
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤Yuichi Sakuraba
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Saber LAJILI
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014José Paumard
 
50 new things you can do with java 8
50 new things you can do with java 850 new things you can do with java 8
50 new things you can do with java 8José Paumard
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJosé Paumard
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8José Paumard
 
Introduction to Apache Tomcat 7 Presentation
Introduction to Apache Tomcat 7 PresentationIntroduction to Apache Tomcat 7 Presentation
Introduction to Apache Tomcat 7 PresentationTomcat Expert
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionYann Caron
 

En vedette (20)

Le framework-executor
Le framework-executorLe framework-executor
Le framework-executor
 
Programmation des Threads en java
Programmation des Threads en javaProgrammation des Threads en java
Programmation des Threads en java
 
Cours java avance avancé thread arraylist
Cours java avance avancé thread arraylistCours java avance avancé thread arraylist
Cours java avance avancé thread arraylist
 
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
Rapport PFE : Développement D'une application de gestion des cartes de fidéli...
 
Programmation en-java-api
Programmation en-java-apiProgrammation en-java-api
Programmation en-java-api
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Hacking Tomcat
Hacking TomcatHacking Tomcat
Hacking Tomcat
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014
 
Le Réseau et Java
Le Réseau et JavaLe Réseau et Java
Le Réseau et Java
 
50 new things you can do with java 8
50 new things you can do with java 850 new things you can do with java 8
50 new things you can do with java 8
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Tp3 matlab
Tp3 matlabTp3 matlab
Tp3 matlab
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8
 
Tp4 matlab
Tp4 matlabTp4 matlab
Tp4 matlab
 
Introduction to Apache Tomcat 7 Presentation
Introduction to Apache Tomcat 7 PresentationIntroduction to Apache Tomcat 7 Presentation
Introduction to Apache Tomcat 7 Presentation
 
Tp2 matlab
Tp2 matlab Tp2 matlab
Tp2 matlab
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introduction
 

Similaire à Introduction aux-sockets

173544 introduction-aux-sockets
173544 introduction-aux-sockets173544 introduction-aux-sockets
173544 introduction-aux-socketsnaimanaima1
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c mouad Lousimi
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfSouf212
 
Chapitre-4-Programmation-réseau-avec-les-sockets.pdf
Chapitre-4-Programmation-réseau-avec-les-sockets.pdfChapitre-4-Programmation-réseau-avec-les-sockets.pdf
Chapitre-4-Programmation-réseau-avec-les-sockets.pdfYoussefJamma
 
Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec GoMickaël Rémond
 
Deploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdfDeploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdfmerazgaammar2
 
Webserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas docWebserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas docWinslo Nwan
 
Copy of communiquer entre applications couche3
Copy of communiquer entre applications couche3Copy of communiquer entre applications couche3
Copy of communiquer entre applications couche3DGMALY
 
Réseau de capteurs sans fil
Réseau de capteurs sans fil  Réseau de capteurs sans fil
Réseau de capteurs sans fil Ghassen Chaieb
 
les servlets-java EE
les  servlets-java EEles  servlets-java EE
les servlets-java EEYassine Badri
 

Similaire à Introduction aux-sockets (20)

173544 introduction-aux-sockets
173544 introduction-aux-sockets173544 introduction-aux-sockets
173544 introduction-aux-sockets
 
8-socket.pdf
8-socket.pdf8-socket.pdf
8-socket.pdf
 
Les sockets.pptx
Les sockets.pptxLes sockets.pptx
Les sockets.pptx
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
 
module_I6_Sockets.pdf
module_I6_Sockets.pdfmodule_I6_Sockets.pdf
module_I6_Sockets.pdf
 
Chapitre-4-Programmation-réseau-avec-les-sockets.pdf
Chapitre-4-Programmation-réseau-avec-les-sockets.pdfChapitre-4-Programmation-réseau-avec-les-sockets.pdf
Chapitre-4-Programmation-réseau-avec-les-sockets.pdf
 
Rapport tp2 j2ee
Rapport tp2 j2eeRapport tp2 j2ee
Rapport tp2 j2ee
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
Chap7 java net
Chap7 java netChap7 java net
Chap7 java net
 
Chap7_JavaNet.pdf
Chap7_JavaNet.pdfChap7_JavaNet.pdf
Chap7_JavaNet.pdf
 
Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec Go
 
APACHE TOMCAT
APACHE TOMCATAPACHE TOMCAT
APACHE TOMCAT
 
Deploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdfDeploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdf
 
Webserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas docWebserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas doc
 
Rapport des travaux
Rapport des travauxRapport des travaux
Rapport des travaux
 
Copy of communiquer entre applications couche3
Copy of communiquer entre applications couche3Copy of communiquer entre applications couche3
Copy of communiquer entre applications couche3
 
Réseau de capteurs sans fil
Réseau de capteurs sans fil  Réseau de capteurs sans fil
Réseau de capteurs sans fil
 
les servlets-java EE
les  servlets-java EEles  servlets-java EE
les servlets-java EE
 
[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker
 

Introduction aux-sockets

  • 1. Introduction aux sockets Par SoftDeath www.siteduzero.com Licence Creative Commons 2 2.0 Dernière mise à jour le 15/05/2012
  • 2. Sommaire 2Sommaire ........................................................................................................................................... 1Lire aussi ............................................................................................................................................ 3Introduction aux sockets .................................................................................................................... 4Récupérer une adresse IP avec InetAddress ................................................................................................................... 5Qu'est-ce qu'un socket ? ................................................................................................................................................... 8Échange de message ....................................................................................................................................................... 11Côté Serveur ............................................................................................................................................................................................................. 11Côté Client ................................................................................................................................................................................................................. 11Utilisation des threads ............................................................................................................................................................................................... 13TP : un mini-chat entre le client et le serveur ! ................................................................................................................ 22Q.C.M. ............................................................................................................................................................................. 23Partager ..................................................................................................................................................................................................................... 2/24 www.siteduzero.com
  • 3. Introduction aux sockets Par SoftDeath Mise à jour : 15/05/2012 Difficulté : Difficile 1 536 visites depuis 7 jours, classé 91/797 Bienvenue dans mon tout premier mini-tutoriel consacré auxsockets en langage Java. On ne va pas tout apprendre sur les sockets mais étudier le plus important concernant ces classes du répertoire java.net. Avant de vous lancer dans la lecture de ce tutoriel, les deuxpremières parties de cysboy sur le langage Java ainsi que la lecture de celui sur les threads et les fluxd'entrées et sorties (1/2) sont primordiales pour bien suivre le cours ! Je vous recommande également de lire le chapitre de Dalshim Bien fermer ses threads en Java si vous voulez bien maîtriser la fermeture de vos threads. Les sockets servent à communiquer entre deuxhôtes appelés Client / Serveur à l'aide d'une adresse IP et d'un port que j'appelle prise ; ces sockets permettront de gérer des fluxentrant et sortant afin d'assurer une communication entre les deux(le client et le serveur), soit de manière fiable à l'aide du protocole TCP/IP, soit non fiable mais plus rapide avec le protocole UDP. Nous allons étudier le premier mode, le mode TCP/IP… Voici ce qu'on peut réaliser à l'aide des sockets : des jeuxen ligne ; des systèmes distribués ; des espaces messengers comme MSN Messenger, Yahoo Messenger, … ; des applications comme BitComet permettant de gérer les fichiers .torrent que vous connaissez ; et bien d'autres choses. Les sockets sont utilisés dans plusieurs autres langages, tels que : le langage C : ( lien vers un tutoriel) ; le langage C++ : (lien vers un autre tutoriel) ; le langage PHP : (lien vers un troisième tutoriel) ; l'Action Script : (aller lire le tutoriel) ; le Erlang : (lien vers le tuto concerné) ; et bien d'autres. Lire les parties « histoire » et « définitions » de tutoriels ci-dessus ne vous fera pas de mal. Ne tardons pas et commençons. Sommaire du tutoriel : Récupérer une adresse IP avec InetAddress Qu'est-ce qu'un socket ? Échange de message TP : un mini-chat entre le client et le serveur ! Q.C.M. Sommaire 3/24 www.siteduzero.com
  • 4. Récupérer une adresse IP avec InetAddress Le package java.net de la plate-forme Java fournit une classe InetAddress qui nous permet de récupérer et manipuler son adresse internet, IP pour les intimes. Cette classe n'a pas de constructeur, pour pouvoir avoir une instance de cette classe on a besoin des méthodes de classe. Voici les méthodes dont je vous parle : getLocalHost() : elle retourne un objet qui contient l'adresse IP de la machine locale. getByName(String nom_de_l_machine) : elle retourne un objet qui contient l'adresse IP de la machine dont le nom est passé en paramètre. getAllByName(String nom_de_l_machine) : elle retourne un tableau d'objets qui contient l'ensemble d'adresses IP de la machine qui correspond au nom passé en paramètre. A présent, voyons les méthodes applicables à un objet de cette classe : getHostName() : elle retourne le nom de la machine dont l'adresse est stockée dans l'objet. getAddress() : elle retourne l'adresse IP stockée dans l'objet sous forme d'un tableau de 4 octets. toString() : elle retourne un String qui correspond au nom de la machine et son adresse. Et pour terminer un petit exemple : Code : Java import java.net.InetAddress; import java.net.UnknownHostException; public class Adressage { public static void main(String[] zero) { InetAddress LocaleAdresse ; InetAddress ServeurAdresse; try { LocaleAdresse = InetAddress.getLocalHost(); System.out.println("L'adresse locale est : "+LocaleAdresse ); ServeurAdresse= InetAddress.getByName("www.siteduzero.com"); System.out.println("L'adresse du serveur du site du zéro est : "+ServeurAdresse); } catch (UnknownHostException e) { e.printStackTrace(); } } } Et le résultat est : Code : Console L'adresse locale est : softdeath/239.254.78.177 L'adresse du serveur du site du zéro est : www.siteduzero.com/80.248.219.123 Introduction aux sockets 4/24 www.siteduzero.com
  • 5. Fastoche, hein ? La classe InetAdress peut lever une exception de type UnknownHostException, tâchez de ne pas l'oublier ! Nous savons maintenant comment récupérer l'adresse IP de notre machine ou d'une machine distante, que diriez-vous si l'on l'utilisait pour créer notre tout premier socket ? C'est parti Qu'est-ce qu'un socket ? Un socket est un point de terminaison d'une communication bidirectionnelle, c'est-à-dire entre un client et un serveur en cours d'exécution sur un réseau donné. Les deuxsont liés par un même numéro de port TCP de sorte que la couche puisse identifier la demande de partage de données. Un serveur fonctionne sur une machine bien définie et est lié à un numéro de port spécifique. Le serveur se met simplement à l'écoute d'un client, qui demande une connexion. En outre, java.net comprend la classe ServerSocket, qui met en oeuvre une sorte de prise que les serveurs peuvent utiliser pour écouter et accepter les connexions des clients. Ce qui nous donne : Code : Java ServerSocket socketserver = new ServerSocket(numero_port); Ainsi on obtient un objet de la classe ServerSocket sur un port spécifique : si ce dernier est à 0, le socket est créée sur n'importe quel port libre. Il existe deuxautres constructeurs ; l'un a deuxparamètres, le premier est bien sûr le numéro de port et le nombre total de connexion simultanées acceptées, voyez : Code : Java ServerSocket socketserver = new ServerSocket(numer_port,nbr_max); nbr_max est le nombre maximal de connexions traitées simultanément. Par exemple au-delà de cinq tentatives de connexion consécutives autorisées, les connexions sont refusés. Introduction aux sockets 5/24 www.siteduzero.com
  • 6. Pour le second constructeur il suffit de spécifier l'adresse locale du serveur. Code : Java ServerSocket socketserver = new ServerSocket(numer_port,nbr_max,adresse_locale); Quant au client, celui-ci connaît le nom de la machine sur laquelle le serveur est en exécution et le numéro de port sur lequel il écoute. Le client va demander une connexion au serveur en s'identifiant avec son adresse IP ainsi que le numéro de port qui lui est lié. Pour cela, le package java.net fournit une classe Socket qui met en œuvre une connexion bidirectionnelle entre votre programme Java et un autre programme situé sur le réseau. La classe Socket permet de cacher les détails d'implémentation de cette connexion. En utilisant cette classe en lieu et place d'un code natif, vos programmes peuvent communiquer sur le réseau quel que soit la plateforme sur laquelle ils se trouvent. La création d'un socket pour un programme client s'effectue à l'aide d'un des constructeurs suivants : Code : Java Socket socket = new Socket(param1, param2) Le premier paramètre correspond à l'identité du client, il peut être une chaine de caractère ou de type InetAddress, param2 correspond au numéro de port sur lequel on souhaite se connecter sur le serveur. Il est possible également de spécifier son adresse local comme troisième paramètre et le numéro de port local : Code : Java Socket socket = new Socket(adresse_distante, port_distant, adresse_locale, port_locale) Après tentative de connexion, si tout va bien, le serveur accepte la connexion du client, et reçoit un nouveau socket qui est directement lié au même port local. Il a besoin d'une nouvelle prise de sorte qu'elle puisse continuer à écouter le socket d'origine pour les demandes de connexion, tout t'en satisfaisant les besoins du client connecté. Voici comment accepter une connexion d'un client : Code : Java Socket socketduserveur = socketserver.accept(); Une fois le socket créé, l'attente de connexion provenant du client se fait à l'aide de la méthode accept(). La méthode accept() reste bloquante tant qu'elle n'a pas détecté de connexion. Afin d'éviter une attente infinie, il est possible de spécifier un délai maximal d'attente à l'aide d'un mutateur setSoTimeout. Si un timeout est une valeur strictement positive, l'appel accept() va générer une attente maximale égale à timeout. Si ce temps expire, une exception de type InterruptedIOException est levée sans toute fois que la socket de type ServerSocket ne soit invalidée. La lecture de ce timeout se fait à l'aide de l'accesseur getSoTimeout(). Côté client, si la connexion est acceptée, une socket est créé et le client peut utiliser la socket pour communiquer avec le serveur. Introduction aux sockets 6/24 www.siteduzero.com
  • 7. L'établissement d'une connexion peut lever une exception de type IOException. On va essayer d'établir une communication. Vous avez tout les éléments à portée de main, vous pouvez désormais établir une connexion, au boulot ! ...Ce n'était pas si difficile que ça, voyons la correction Le client et le serveur peuvent à présent communiquer par l'écriture ou la lecture de leurs prises. Secret (cliquez pour afficher) Serveur.java Code : Java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Serveur { public static void main(String[] zero) { ServerSocket socketserver ; Socket socketduserveur ; try { socketserver = new ServerSocket(2009); socketduserveur = socketserver.accept(); System.out.println("Un zéro s'est connecté !"); socketserver.close(); socketduserveur.close(); }catch (IOException e) { e.printStackTrace(); } } } Client.java Code : Java import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] zero) { Socket socket; try { socket = new Socket(InetAddress.getLocalHost(),2009); socket.close(); }catch (UnknownHostException e) { Introduction aux sockets 7/24 www.siteduzero.com
  • 8. e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } } Lancez le serveur en premier et ensuite le client ! Vous venez d'établir votre première connexion entre un serveur et un client . Maintenant, voyons comment envoyer et recevoir des messages. Attention : il ne faut jamais oublier de fermer le socket ! Sinon si vous utilisez le même port dans un autre programme, ce (l'action de fermer une socket) ne sera plus possible car il (le port) sera occupé ! Échange de message Une fois la connexion établie et les sockets en possession, il est possible de récupérer le fluxd'entrée et de sortie de la connexion TCP vers le serveur. Il existe deuxméthodes pour permettre la récupération des flux: getInputStream() de la classe InputStream. Elle nous permet de gérer les fluxentrant ; getOutputStream() de la classe OuputStream. Elle nous permet de gérer les fluxsortant. Ces deuxméthodes nous permettent donc de gérer les fluxen entrée et en sortie. En général le type d'entrée et sortie utilisé est BufferedReader et InputStreamReader pour la lecture, PrintWriter pour l'écriture. Mais on peut utiliser tous les autres flux. En se basant sur l'annexe du tuto Java : BufferedReader : cette classe permet de lire des caractères à partir d'un fluxtamponné, afin de faire des lectures plus rapides ; InputStreamReader : convertit un fluxbinaire en fluxde caractères : elle convertit un objet de type InputStream en objet de type Reader ; PrintWriter : la classe PrintWriter ajoute à un fluxla possibilité de faire des écritures sous forme de texte des types primitifs Java, et des chaînes de caractères. Un petit exemple de communication en image et en code source : Introduction aux sockets 8/24 www.siteduzero.com
  • 9. Serveur.java Code : Java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.io.PrintWriter; public class Serveur { public static void main(String[] zero) { ServerSocket socketserver ; Socket socketduserveur ; BufferedReader in; PrintWriter out; try { socketserver = new ServerSocket(2009); System.out.println("Le serveur est à l'écoute du port "+socketserver.getLocalPort()); socketduserveur = socketserver.accept(); System.out.println("Un zéro s'est connecté"); out = new PrintWriter(socketduserveur.getOutputStream()); out.println("Vous êtes connecté zéro !"); out.flush(); socketduserveur.close(); socketserver.close(); }catch (IOException e) { Introduction aux sockets 9/24 www.siteduzero.com
  • 10. e.printStackTrace(); } } } Client.java Code : Java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] zero) { Socket socket; BufferedReader in; PrintWriter out; try { socket = new Socket(InetAddress.getLocalHost(),2009); System.out.println("Demande de connexion"); in = new BufferedReader (new InputStreamReader (socket.getInputStream())); String message_distant = in.readLine(); System.out.println(message_distant); socket.close(); }catch (UnknownHostException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } } Résultat chez le serveur : Code : Console Le serveur est à l'écoute du port 2009 Un zéro s'est connecté Résultat chez le client : Introduction aux sockets 10/24 www.siteduzero.com
  • 11. Code : Console Demande de connexion Vous êtes connecté zéro ! Ho là ! Un instant ! C'est quoi, ces encapsulations et ce flush ? Rassurez-vous, on va tout expliquer en détail ( ), surtout ne vous affolez pas. Côté Serveur Après établissement de la connexion, le serveur obtient son socket qu'il utilise pour gérer le fluxsortant à l'aide de socketduserveur.getOutputStream() ; ensuite, à l'aide de la méthode println on envoie un message au client, on utilise flush pour vider le buffer tout simplement. Et pour finir on ferme la connexion. Côté Client Après avoir obtenu notre socket, on utilise socket.getInputStream() pour récupérer le fluxsortant. La méthode readLine() nous permet de lire une chaîne de caractères. Il existe plusieurs autres méthodes telles : readInt() permettant de lire un entier ; readDouble() permettant de lire un nombre de type double ; … Pour finir, on affiche le message reçu et on ferme notre socket. Ça a l'air très simple à première vue pour deuxhôtes, mais si l'on veut que plus que deuxpuissent communiquer entre euxà la fois, comment faire ? D'où la nécessité d'utiliser les Threads. Utilisation des threads Je pars du principe que vous connaissez ce que sont les threads et comment les utiliser et pourquoi doit-on les utiliser dans nos programme, on va donc attaquer directement la pratique. Le principe d'utilisation des Threads est simple (sera simple si vous suivez attentivement :D).Après avoir créer un objet ServerSocket par le serveur, on le place (l'objet) comme paramètre à un constructeur de la classe qui implémente la classe Runnable ou étend la classe Thread, dès qu'un client souhaite se connecter avec le serveur, un Thread s'occupe de la connexion, il ne sera plus la peine de faire appel au serveur lorsqu'un client souhaite se connecter, tout le boulot sera confié à un Thread. Vous commencez à comprendre l'utilité des Threads avec le temps vous ne pourrez plus vous en passer. Voyons un petit exemple de connexion Multi-Threads en image et avec un code source toujours : Introduction aux sockets 11/24 www.siteduzero.com
  • 12. Serveur.java Code : Java import java.io.IOException; import java.net.*; public class Serveur { public static void main(String[] zero){ ServerSocket socket; try { socket = new ServerSocket(2009); Thread t = new Thread(new Accepter_clients(socket)); t.start(); System.out.println("Mes employeurs sont prêts !"); } catch (IOException e) { e.printStackTrace(); } } } class Accepter_clients implements Runnable { private ServerSocket socketserver; private Socket socket; private int nbrclient = 1; public Accepter_clients(ServerSocket s){ socketserver = s; } public void run() { try { while(true){ socket = socketserver.accept(); // Un client se connecte on l'accepte System.out.println("Le client numéro "+nbrclient+ " est connecté !"); nbrclient++; socket.close(); } } catch (IOException e) { e.printStackTrace(); Introduction aux sockets 12/24 www.siteduzero.com
  • 13. } } } Client.java Code : Java import java.io.IOException; import java.net.*; public class Client { public static void main(String[] zero){ Socket socket; try { socket = new Socket("localhost",2009); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } Résulats : Code : Console Mes employeurs sont prêts ! Le client numero 1 est connecté ! Le client numero 2 est connecté ! Le client numero 3 est connecté ! Si vous m'avez bien suivis vous ne devriez pas avoir du mal à comprendre ce code. Dès que quelqu'un tape à la porte, on demande à un employer de lui ouvrir la porte, celui-là va le saluer et lui dire bye bye avec socket.close(); s'il ne veut pas parler (communiquer) . TP : un mini-chat entre le client et le serveur ! À présent que nous savons su manier les sockets en utilisant les threads, réalisons un petit programme client / serveur : après la connexion du client, celui-ci devra s'authentifier en premier, le serveur va vérifier dans un fichier la validité de ses données ; si tout est O.K., un message lui dira qu'il est connecté, ils pourront ensuite envoyer tous leurs messages au serveur. Voilà : très simple. On devra avoir quelque chose de ce genre côté serveur, pour plusieurs clients à la fois : Code : Console Le serveur est à l'écoute du port 2009 Un zéro veut se connecter softdeath vient de se connecter softdeath : salut, M. le serveur, j'ai besoin de vos services. Introduction aux sockets 13/24 www.siteduzero.com
  • 14. Un zéro veut se connecter chabanus vient de se connecte chabanus : salut, j'ai besoin d'accéder à telles données. et du côté du client, tête-à-tête avec le serveur après connexion : Code : Console Demande de connexion Connexion établie avec le serveur, authentification : Entrez votre login : chabanus Entrez votre mot de passe : chabanus Je suis connecté Votre message : salut Le serveur vous dit : salut Votre message : ça va ? Le serveur vous dit : bien et toi ? Allez au boulot ! … … … … J'espère que vous avez au moins essayé. Cette solution n'est ni unique ni la meilleure, elle est simple et minimale pour vous montrer comment les threads doivent être gérés. Voyons la correction : Côté Serveur Secret (cliquez pour afficher) Accepter_connexion.java Code : Java import java.io.*; import java.net.*; public class Accepter_connexion implements Runnable{ private ServerSocket socketserver = null; private Socket socket = null; public Thread t1; public Accepter_connexion(ServerSocket ss){ socketserver = ss; } public void run() { try { while(true){ socket = socketserver.accept(); System.out.println("Un zéro veut se connecter "); Introduction aux sockets 14/24 www.siteduzero.com
  • 15. t1 = new Thread(new Authentification(socket)); t1.start(); } } catch (IOException e) { System.err.println("Erreur serveur"); } } } Authentification .java Code : Java import java.net.*; import java.util.NoSuchElementException; import java.util.Scanner; import java.io.*; public class Authentification implements Runnable { private Socket socket; private PrintWriter out = null; private BufferedReader in = null; private String login = "zero", pass = null; public boolean authentifier = false; public Thread t2; public Authentification(Socket s){ socket = s; } public void run() { try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream()); while(!authentifier){ out.println("Entrez votre login :"); out.flush(); login = in.readLine(); out.println("Entrez votre mot de passe :"); out.flush(); pass = in.readLine(); if(isValid(login, pass)){ out.println("connecte"); System.out.println(login +" vient de se connecter "); out.flush(); authentifier = true; } else {out.println("erreur"); out.flush();} } t2 = new Thread(new Chat_ClientServeur(socket,login)); t2.start(); } catch (IOException e) { System.err.println(login+" ne répond pas !"); } Introduction aux sockets 15/24 www.siteduzero.com
  • 16. } } private static boolean isValid(String login, String pass) { boolean connexion = false; try { Scanner sc = new Scanner(new File("zero.txt")); while(sc.hasNext()){ if(sc.nextLine().equals(login+" "+pass)){ connexion=true; break; } } } catch (FileNotFoundException e) { System.err.println("Le fichier n'existe pas !"); } return connexion; } } Chat_ClientServeur.java Code : Java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Chat_ClientServeur implements Runnable { private Socket socket = null; private BufferedReader in = null; private PrintWriter out = null; private String login = "zero"; private Thread t3, t4; public Chat_ClientServeur(Socket s, String log){ socket = s; login = log; } public void run() { try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream()); Thread t3 = new Thread(new Reception(in,login)); t3.start(); Thread t4 = new Thread(new Emission(out)); t4.start(); } catch (IOException e) { System.err.println(login +"s'est déconnecté "); } } } Introduction aux sockets 16/24 www.siteduzero.com
  • 17. Emission .java Code : Java import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; public class Emission implements Runnable { private PrintWriter out; private String message = null; private Scanner sc = null; public Emission(PrintWriter out) { this.out = out; } public void run() { sc = new Scanner(System.in); while(true){ System.out.println("Votre message :"); message = sc.nextLine(); out.println(message); out.flush(); } } } Reception.java Code : Java import java.io.BufferedReader; import java.io.IOException; public class Reception implements Runnable { private BufferedReader in; private String message = null, login = null; public Reception(BufferedReader in, String login){ this.in = in; this.login = login; } public void run() { while(true){ try { message = in.readLine(); System.out.println(login+" : "+message); } catch (IOException e) { e.printStackTrace(); } } } Introduction aux sockets 17/24 www.siteduzero.com
  • 18. } Serveur.java Code : Java import java.io.*; import java.net.*; public class Serveur { public static ServerSocket ss = null; public static Thread t; public static void main(String[] args) { try { ss = new ServerSocket(2009); System.out.println("Le serveur est à l'écoute du port "+ss.getLocalPort()); t = new Thread(new Accepter_connexion(ss)); t.start(); } catch (IOException e) { System.err.println("Le port "+ss.getLocalPort()+" est déjà utilisé !"); } } } Côté Client Secret (cliquez pour afficher) Chat_ClientServeur.java Code : Java import java.io.*; import java.net.*; import java.util.Scanner; public class Chat_ClientServeur implements Runnable { private Socket socket; private PrintWriter out = null; private BufferedReader in = null; private Scanner sc; private Thread t3, t4; public Chat_ClientServeur(Socket s){ socket = s; } public void run() { try { Introduction aux sockets 18/24 www.siteduzero.com
  • 19. out = new PrintWriter(socket.getOutputStream()); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); sc = new Scanner(System.in); Thread t4 = new Thread(new Emission(out)); t4.start(); Thread t3 = new Thread(new Reception(in)); t3.start(); } catch (IOException e) { System.err.println("Le serveur distant s'est déconnecté !"); } } } Client.java Code : Java import java.io.*; import java.net.*; public class Client { public static Socket socket = null; public static Thread t1; public static void main(String[] args) { try { System.out.println("Demande de connexion"); socket = new Socket("127.0.0.1",2009); System.out.println("Connexion établie avec le serveur, authentification :"); // Si le message s'affiche c'est que je suis connecté t1 = new Thread(new Connexion(socket)); t1.start(); } catch (UnknownHostException e) { System.err.println("Impossible de se connecter à l'adresse "+socket.getLocalAddress()); } catch (IOException e) { System.err.println("Aucun serveur à l'écoute du port "+socket.getLocalPort()); } } } Connexion.java Code : Java Introduction aux sockets 19/24 www.siteduzero.com
  • 20. import java.net.*; import java.util.Scanner; import java.io.*; public class Connexion implements Runnable { private Socket socket = null; public static Thread t2; public static String login = null, pass = null, message1 = null, message2 = null, message3 = null; private PrintWriter out = null; private BufferedReader in = null; private Scanner sc = null; private boolean connect = false; public Connexion(Socket s){ socket = s; } public void run() { try { out = new PrintWriter(socket.getOutputStream()); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); sc = new Scanner(System.in); while(!connect ){ System.out.println(in.readLine()); login = sc.nextLine(); out.println(login); out.flush(); System.out.println(in.readLine()); pass = sc.nextLine(); out.println(pass); out.flush(); if(in.readLine().equals("connecte")){ System.out.println("Je suis connecté "); connect = true; } else { System.err.println("Vos informations sont incorrectes "); } } t2 = new Thread(new Chat_ClientServeur(socket)); t2.start(); } catch (IOException e) { System.err.println("Le serveur ne répond plus "); } } } Emission.java Code : Java Introduction aux sockets 20/24 www.siteduzero.com
  • 21. import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; public class Emission implements Runnable { private PrintWriter out; private String login = null, message = null; private Scanner sc = null; public Emission(PrintWriter out) { this.out = out; } public void run() { sc = new Scanner(System.in); while(true){ System.out.println("Votre message :"); message = sc.nextLine(); out.println(message); out.flush(); } } } Reception.java Code : Java import java.io.BufferedReader; import java.io.IOException; public class Reception implements Runnable { private BufferedReader in; private String message = null; public Reception(BufferedReader in){ this.in = in; } public void run() { while(true){ try { message = in.readLine(); System.out.println("Le serveur vous dit :" +message); } catch (IOException e) { e.printStackTrace(); } } } } Introduction aux sockets 21/24 www.siteduzero.com
  • 22. Lancez serveur.java et ensuite client.java, n'oubliez pas de créer un fichier pour le serveur pour qu'il puisse y vérifier l'identité de ses clients, je l'ai nommé zero.txt : vous pouvez le nommer comme vous le souhaitez, c'est à votre guise. Optimisation : Pour ne pas dire qu'il en existe à l'infini, plusieurs autres possibilités s'offrent à vous, vous pouvez : rendre l'application client / client. Le serveur authentifie les deuxclients et ces deux-là pourront discuter ensemble sans que d'autres puissent y entrer : grosso modo réaliser un « salon », comme on l'appelle ; utiliser les bases de données pour la sauvegarde des messages et pour authentifier les clients ; réaliser une interface graphique en swing ou en awt ; … Croyez-moi : lorsque vous maîtriserez les sockets en utilisant les threads, rien ne sera plus compliqué pour vous. Bonne continuation à tous ; surtout n'hésitez pas à l'améliorer et envoyez-moi un MP pour m'exposer votre travail. Q.C.M. Le premier QCM de ce cours vous est offert en libre accès. Pour accéder auxsuivants Connectez-vous Inscrivez-vous Quelle est la classe qui permet de créer un socket pour le serveur ? SocketServer. ServeurSocket. SocketServeur. ServerSocket. Un client peut créer plusieurs sockets. Vrai. Faux. Qu'est-ce qui cloche dans ce code ? Code : Java try { ServerSocket ss= new ServerSocket(1026); ss.close(); Socket s = ss.accept(); } catch (IOException e) { } On a oublié d'utiliser les threads. On doit d'abord instancier un objet Socket avant ServerSocket. On a coupé l'écoute du serveur avant d'accepter les clients. On devrait mettre 2009 à la place de 1026. Le port 1026 est un port réservé. Correction ! Statistiques de réponses au QCM Le mode UDP est plus rapide que le mode TCP mais c'est une communication non fiable, car on ne se préoccupe pas du résultat de la réception du récepteur, il est donc moins utilisé. Maintenant que vous savez manier les sockets, le mode UDP ne devrait pas vous poser de problème . Introduction aux sockets 22/24 www.siteduzero.com
  • 23. Je vous remercie d'avoir lu le tutoriel, il est à présent terminé. J'espère que vous avez bien suivi À la prochaine pour un autre tutoriel client/serveur ! La technologie RMI (Remote Method Invocation) ! Qui vous permettra de mieuxcomprendre la nature et la fonction des EJB (Entreprise JavaBeans) qui représente l'étendard de la plate-forme J2EE ! Je remercie : Le membre cysboy pour m'avoir encouragé. Les validateurs Xavinou, Coyote et Thunderseb. Le zCorrecteur Poulpette pour avoir pris le temps de corriger le tutoriel. Enfin, tout le staff du site du zéro qui nous permet de rédiger des tutoriels pour débutants. Partager Ce tutoriel a été corrigé par les zCorrecteurs. Introduction aux sockets 23/24 www.siteduzero.com