23
Introduction aux sockets Par So ft Death www.siteduzero.com Licence Creative Commons BY 2.0 Dernière mise à jour le 16/11/2011

Introduction Aux Sockets

Embed Size (px)

Citation preview

Page 1: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 1/23

 

Introduction aux

sockets

Par SoftDeath

www.siteduzero.com

Licence Creative Commons BY 2.0 Dernière mise à jour le 16/11/2011

Page 2: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 2/23

 

Sommaire

1Sommaire ...........................................................................................................................................0Lire aussi ............................................................................................................................................2Introduction aux sockets ....................................................................................................................

3Récupérer une adresse IP avec InetAddress ................................................................................................................... 4Qu'est-ce qu'un socket ? ...................................................................................................................................................7Échange de message .......................................................................................................................................................

10Côté Serveur .............................................................................................................................................................................................................10Côté Client .................................................................................................................................................................................................................10Utilisation des threads ...............................................................................................................................................................................................12TP : un mini-chat entre le client et le serveur ! ................................................................................................................21Q.C.M. .............................................................................................................................................................................22Partager .....................................................................................................................................................................................................................

Sommaire 1/22

www.siteduzero.com

Page 3: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 3/23

 

Introduction aux sockets

Par  SoftDeath

Mise à jour : 21/09/2009Difficulté : Difficile812 visites depuis 7 jours, class é 131/779

Bienvenue dans mon tout premier mini-tutoriel cons acré aux sockets en langage Java. On ne va pas tout apprendre sur lessockets mais étudier le plus important concernant ces classes du répertoire java.net.

Avant de vous lancer dans la lectur e de ce tutoriel, les deux premières parties de cysboy sur le langage Java ainsi que lalecture de celui sur les threads et les flux d'entrées et sorties (1/2) sont primordiales pour bien s uivre le cours !

Je vous recommande également de lire le chapitre de Dalshim Bien fermer ses threads en Java si vous voulez bien maîtriser lafermeture de vos threads.

Les sockets servent à communiquer entre deux hôtes appelés Client / Serveur à l'aide d'une adress e IP et d'un port que j'appelle prise ; ces sockets permettront de gérer des flux entrant et s ortant afin d'ass urer une communication entre les deux (le client et leserveur), 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 s ockets :

des jeux en ligne ;des s ystè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 « histo ire » 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 InetAddressQu'est-ce qu'un socket ?Échange de mess ageTP : un mini-chat entre le client et le serveur !

Introduction aux sockets 2/22

www.siteduzero.com

Page 4: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 4/23

 

Q.C.M.

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 adress einternet, IP pour les intimes. Cette classe n'a pas de cons tructeur, pour pouvoir avoir une instance de cette classe on a besoindes 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'adress e 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 lamachine 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 es t s tockée dans l'objet. getAddress() : elle retourne l'adresse IP s tocké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 adress e.

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 dusite du zéro est : "+ServeurAdresse); 

} catch (UnknownHostException e) { 

e.printStackTrace();  } }

}

Et le résultat es t :

Code : Console

L'adresse locale est : softdeath/239.254.78.177L'adresse du serveur du site du zéro est : www.siteduzero.com/80.248.219.123

Introduction aux sockets 3/22

www.siteduzero.com

Page 5: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 5/23

 

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 d iriez-vous s i l'onl'utilisait pour créer notre tout premier socket ? C'est parti

Qu'est-ce qu'un socket ?

Un socket es t un point de terminaison d'une communication bidirectionnelle, c'est-à-dire entre un client et un serveur en coursd'exécution sur un réseau donné. Les deux sont liés par un même numéro de port TCP de sorte que la couche puiss e identifier lademande de partage de données.

Un serveur fonct ionne sur une machine bien définie et est lié à un numéro de port spécifique. Le serveur se met s implement à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 s erveurs 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'importequel port libre.

Il existe deux autres constructeurs ; l'un a deux paramè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);

Introduction aux sockets 4/22

www.siteduzero.com

Page 6: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 6/23

 

nbr_max est le nombre maximal de connexions traitées simultanément. Par exemple au-delà de cinq tentatives de connexionconsécutives autorisées, les connexions sont refusés.

Pour le second const ructeur il suffit de spécifier l'adresse locale du serveur.

Code : Java

ServerSocket socketserver = newServerSocket(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 s erveur en s 'identifiant avec son adresse IP ainsi que le numéro de port qui luiest lié.

Pour cela Java.net fournit une classe Socket qui met en oeuvre un côté d 'une connexion bidirectionnelle entre votre programmeJava et un aut re programme sur le réseau. La classe Socket se trouve au sommet d'une plate-forme de charge de mise en oeuvreen cachant les détails d'un s ystème particulier de votre programme Java. En utilisant la Socket classe au lieu de compter sur du

code natif, vos programmes Java peuvent communiquer sur le réseau en une plate-forme indépendante de la mode. La créationd'un socket pour le client nécess ite un des cons tructeurs s uivants :

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, param2correspond au numéro de port s ur lequel on souhaite se connecter sur le serveur. Il est possible également de spécifier sonadresse 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 b ien, le serveur accepte la connexion du client, et reçoit un nouveau s ocket qui estdirectement 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 bes oins du client connecté. Voici comment accepter une connexiond'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 tempsexpire, une exception de type InterruptedIOException est levée sans toute fois que la socket de type ServerSocket ne soitinvalidée. La lecture de ce timeout se fait à l'aide de l'accesseur  getSoTimeout() .

Introduction aux sockets 5/22

www.siteduzero.com

Page 7: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 7/23

 

Côté client, s i la connexion est acceptée, une socket est créé et le client peut u tiliser la socket pour communiquer avec le serveur.L'établiss ement d'une connexion peut lever une exception de type IOException .

On va es sayer d'établir une communication. Vous avez tout les éléments à portée de main, vous pouvez désormais établir uneconnexion, 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();

Introduction aux sockets 6/22

www.siteduzero.com

Page 8: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 8/23

 

  }catch (UnknownHostException e) { 

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 s ocket) ne sera plus poss ible 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 flux d'entrée et de sortie de la connexionTCP vers le serveur. Il existe deux méthodes pour permettre la récupération des flux :

 getInputStream() de la classe InputStream. Elle nous permet de gérer les flux entrant ;

 getOutputStream() de la class e OuputStream. Elle nous permet de gérer les flux sortant.

Ces deux méthodes nous permettent donc de gérer les flux en entrée et en s ortie. En général le type d'entrée et s ortie utilisé est BufferedReader et InputStreamReader pour la lecture, PrintWriter pour l'écriture. Mais on peut u tiliser 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 flux tamponné, afin de faire des lectures plusrapides ;

 InputStreamReader : convertit un flux binaire en flux de caractères : elle convertit un objet de type InputStream en objetde type Reader ;

 PrintWriter : la classe PrintWriter ajoute à un flux la 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 7/22

www.siteduzero.com

Page 9: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 9/23

 

 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 8/22

www.siteduzero.com

Page 10: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 10/23

 

 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 9/22

www.siteduzero.com

Page 11: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 11/23

 

Code : Console

Demande de connexionVous êtes connecté zéro !

Ho là ! Un instant ! C'est quoi, ces encapsulations et ce flush ?

Rass urez-vous , on va tout expliquer en détail ( ), surtout ne vous affolez pas.

Côté Serveur 

Après établiss ement de la connexion, le serveur obtient son socket qu'il utilise pour gérer le flux sortant à l'aide de socketduserveur.getOutputStream() ; ens uite, à l'aide de la méthode println on envoie un message au client, on u tilise flush

 pour vider le buffer tout s implement. Et pour finir on ferme la connexion.

Côté Client 

Après avoir obtenu notre socket, on utilise sock et.get InputStream() pour récupérer le flux sortant. 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 deux hôtes, mais si l'on veut que plus que deux puissent communiquer entre eux à lafois, comment faire ? D'où la nécessité d 'utiliser les Threads.

Utilisation des threads

Je pars du principe que vous connaiss ez 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 s imple si vous suivez attentivement :D). Après avoir créer un objetServerSocket  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 laconnexion, il ne sera plus la peine de faire appel au serveur lorsqu'un client s ouhaite se connecter, tout le boulot sera confié à unThread.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 s ource toujours :

Introduction aux sockets 10/22

www.siteduzero.com

Page 12: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 12/23

 

 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 onl'accepte

System.out.println("Le client numéro "+nbrclient+ 

" est connecté !");nbrclient++;socket.close();

  } 

} catch (IOException e) {e.printStackTrace();

Introduction aux sockets 11/22

www.siteduzero.com

Page 13: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 13/23

 

  }  }

 }

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 s uivis 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 laconnexion du client, celui-ci devra s'authentifier en premier, le serveur va vérifier dans un fichier la validité de ses données ; sitout est O.K., un message lui dira qu'il est connecté, ils pourront ensuite envoyer tous leurs mess ages au serveur. Voilà : trèssimple.

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 2009Un zéro veut se connectersoftdeath vient de se connectersoftdeath : salut, M. le serveur, j'ai besoin de vos services.

Introduction aux sockets 12/22

www.siteduzero.com

Page 14: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 14/23

 

Un zéro veut se connecterchabanus vient de se connectechabanus : 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 connexionConnexion établie avec le serveur, authentification :Entrez votre login :chabanusEntrez votre mot de passe :chabanusJe suis connectéVotre message :salutLe 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 n i la meilleure, elle est s imple et minimale pour vous montrer comment les threads doivent êtregé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 13/22

www.siteduzero.com

Page 15: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 15/23

 

 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(newInputStreamReader(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 14/22

www.siteduzero.com

Page 16: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 16/23

 

 }

  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 15/22

www.siteduzero.com

Page 17: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 17/23

 

 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 16/22

www.siteduzero.com

Page 18: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 18/23

 

}

 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 17/22

www.siteduzero.com

Page 19: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 19/23

 

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.javaCode : 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 jesuis 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 18/22

www.siteduzero.com

Page 20: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 20/23

 

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 19/22

www.siteduzero.com

Page 21: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 21/23

 

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 20/22

www.siteduzero.com

Page 22: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 22/23

 

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é deses 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 deux clients et ces deux-là pourront discuter ens emble sansque d 'autres puissent y entrer : gross o modo réaliser un « salon », comme on l'appelle ;utiliser les bas es 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.

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 p ort 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 .

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/s erveur ! La technologie RMI (Remote Method Invocation) ! Qui vous permettra de

Introduction aux sockets 21/22

www.siteduzero.com

Page 23: Introduction Aux Sockets

5/17/2018 Introduction Aux Sockets - slidepdf.com

http://slidepdf.com/reader/full/introduction-aux-sockets-55b07daac2172 23/23

 

mieux comprendre 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 22/22

www.siteduzero.com