173544 Introduction Aux Sockets

23
Introduction aux sockets Par So ft Death www.openclassrooms.com Licence Creative Commons 2 2.0 Dernière mise à jour le 15/05/2012 

Transcript of 173544 Introduction Aux Sockets

  • 5/28/2018 173544 Introduction Aux Sockets

    1/23

    Introduction aux

    sockets

    Par SoftDeath

    www.openclassrooms.com

    Licence Creative Commons 2 2.0Dernire mise jour le 15/05/2012

    http://www.openclassrooms.com/http://www.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    2/23

    Sommaire

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

    3Rcuprer une adresse IP avec InetAddress ................................................................................................................... 5Qu'est-ce qu'un socket ? ...................................................................................................................................................8change de message .......................................................................................................................................................11Ct Serveur .............................................................................................................................................................................................................11Ct Client .................................................................................................................................................................................................................11Utilisation des threads ...............................................................................................................................................................................................

    13TP : un mini-chat entre le client et le serveur ! ................................................................................................................22Q.C.M. .............................................................................................................................................................................23Partager .....................................................................................................................................................................................................................

    2/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://-/?-
  • 5/28/2018 173544 Introduction Aux Sockets

    3/23

    Introduction aux sockets

    Par SoftDeath

    Mise jour : 15/05/2012Difficult : Difficile

    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 rpertoirejava.net.

    Avant de vous lancer dans la lecture de ce tutoriel, les deux premires parties de cysboy sur le langage Javaainsi que lalecture decelui sur les threadset les flux d'entres et sorties (1/2)sont primordiales pour bien s uivre le cours !

    Je vous recommande galement de lirele chapitre de DalshimBien fermer ses threads en Java si vous voulez bien matriser la

    fermeture de vos threads.

    Les sockets servent communiquer entre deux htes appels Client / Serveur l'aide d'une adress e IP et d'un port que j'appelleprise ; ces sockets permettront de grer des flux entrant et s ortant afin d'ass urer une communication entre les deux (le client et leserveur), soit de manire fiable l'aide du protocole TCP/IP, soit non fiable mais plus rapide avec le protocole UDP. Nous allonstudier le premier mode, le mode TCP/IP

    Voici ce qu'on peut raliser l'aide des s ockets :

    des jeux en ligne ;des s ystmes distribus ;

    des espaces messengerscomme MSN Mes senger, Yahoo Messenger, ;des applications comme BitComet permettant de grer les fichiers .torrent que vous connaissez ;et bien d'autres choses .

    Les sockets sont utiliss 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 troisime tutoriel) ;l'Action Script : (aller lire le tutoriel) ;

    le Erlang : (lien vers le tuto concern);et bien d'autres.

    Lire les parties histoire et dfinitions de tutoriels ci-dessus ne vous fera pas de mal.Ne tardons pas et commenons .

    Sommaire du tutoriel :

    Rcuprer une adresse IP avec InetAddress

    Qu'est-ce qu'un socket ?change de mess ageTP : un mini-chat entre le client et le serveur !Q.C.M.

    Rcuprer une adresse IP avec InetAddress

    Sommaire 3/24

    www.openclassrooms.com

    http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#ss_part_1http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#ss_part_1http://www.siteduzero.com/tutoriel-3-66044-les-sockets.htmlhttp://www.siteduzero.com/tutoriel-3-66044-les-sockets.htmlhttp://www.siteduzero.com/tutoriel-3-66044-les-sockets.htmlhttp://www.siteduzero.com/tutoriel-3-3273-histoire-et-fonctionnement.htmlhttp://www.siteduzero.com/tutoriel-3-10516-les-threads.htmlhttp://www.siteduzero.com/tutoriel-3-65524-les-flux-d-entrees-sorties-1-2.htmlhttp://www.v3.siteduzero.com/tutoriel-21-173544-introduction-aux-sockets.htmlhttp://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#qcmhttp://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#ss_part_4http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#ss_part_3http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#ss_part_2http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#ss_part_1http://www.siteduzero.com/tutoriel-3-66044-les-sockets.htmlhttp://www.siteduzero.com/tutoriel-3-63640-creer-une-animation-flash-qui-communique-avec-un-serveur.htmlhttp://www.siteduzero.com/tutoriel-3-10118-comment-utiliser-les-sockets-avec-php-comment-faire-un-chat-avec-les-socketshttp://www.siteduzero.com/tutoriel-3-11396-communiquer-en-reseau-avec-son-programme.htmlhttp://www.siteduzero.com/tutoriel-3-3273-histoire-et-fonctionnement.htmlhttp://www.siteduzero.com/tutoriel-3-127772-bien-fermer-ses-threads-en-java.htmlhttp://www.siteduzero.com/tutoriel-3-65524-les-flux-d-entrees-sorties-1-2.htmlhttp://www.siteduzero.com/tutoriel-3-10516-les-threads.htmlhttp://www.siteduzero.com/tutoriel-3-10601-programmation-en-java.htmlhttp://www.v3.siteduzero.com/tutoriel-21-173544-introduction-aux-sockets.htmlhttp://www.v3.siteduzero.com/membres-294-86570.html
  • 5/28/2018 173544 Introduction Aux Sockets

    4/23

    Le packagejava.netde la plate-forme Java fournit une classe InetAddress qui nous permet de rcuprer 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 mthodes de classe. Voici les mthodes 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 paramtre.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 paramtre.

    A prsent, voyons les mthodes applicables un objet de cette classe :

    getHostName() : elle retourne le nom de la machine dont l'adresse es t s tocke dans l'objet.getAddress() : elle retourne l'adresse IP s tocke 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

    importjava.net.InetAddress;importjava.net.UnknownHostException;

    publicclassAdressage{publicstaticvoidmain(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 zro est : "+ServeurAdresse);

    }catch(UnknownHostException e){

    e.printStackTrace(); }}

    }

    Et le rsultat es t :

    Code : Console

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

    Introduction aux sockets 4/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    5/23

    Fastoche, hein ?

    La classeInetAdresspeut lever une exception de type UnknownHostException, tchez de ne pas l'oublier !

    Nous savons maintenant comment rcuprer l'adresse IP de notre machine ou d'une machine distante, que d iriez-vous s i l'onl'utilisait pour crer 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'excution sur un rseau donn. Les deux sont lis par un mme numro de port TCP de sorte que la couche puiss e identifier lademande de partage de donnes.

    Un serveur fonct ionne sur une machine bien dfinie et est li un numro de port spcifique. Le serveur se met s implement l'coute d'un client, qui demande une connexion.

    En outre,java.netcomprend la class e ServerSocket, qui met en oeuvre une sorte de prise que les s erveurs peuvent utiliser pourcouter et accepter les connexions des clients . Ce qui nous donne :

    Code : Java

    ServerSocket socketserver =newServerSocket(numero_port);

    Ainsi on obtient un objet de la classe ServerSocket sur un port spcifique : si ce dernier est 0, le socket est cre sur n'importequel port libre.

    Il existe deux autres constructeurs ; l'un a deux paramtres, le premier est bien sr le numro de port et le nombre total deconnexion simultanes acceptes, voyez :

    Code : Java

    ServerSocket socketserver =newServerSocket(numer_port,nbr_max);

    nbr_maxest le nombre maximal de connexions traites simultanment. Par exemple au-del de cinq tentatives de connexionconscutives autorises, les connexions sont refuss.

    Introduction aux sockets 5/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    6/23

    Pour le second const ructeur il suffit de spcifier l'adresse locale du serveur.

    Code : Java

    ServerSocket socketserver =newServerSocket(numer_port,nbr_max,adresse_locale);

    Quant au client, celui-ci connat le nom de la machine sur laquelle le serveur est en excution et le numro de port sur lequel ilcoute. Le client va demander une connexion au s erveur en s 'identifiant avec son adresse IP ainsi que le numro de port qui luiest li.

    Pour cela, le packagejava.netfournit une classe Socket qui met en uvre une connexion bidirectionnelle entre votre programmeJava et un autre programme situ s ur le rseau. La classe Socketpermet de cacher les dtails d'implmentation de cetteconnexion. En utilisant cette classe en lieu et place d'un code natif, vos programmes peuvent communiquer sur le rseau quelque soit la plateforme sur laquelle ils se trouvent. La cration d'un socket pour un programme client s 'effectue l'aide d 'un desconstructeurs suivants :

    Code : Java

    Socket socket =newSocket(param1,param2)

    Le premier paramtre correspond l'identit du client, il peut tre une chaine de caractre ou de typeInetAddress, param2correspond au numro de port s ur lequel on souhaite se connecter sur le serveur. Il est possible galement de spcifier sonadresse local comme troisime paramtre et le numro de port local :

    Code : Java

    Socket socket =newSocket(adresse_distante,port_distant,adresse_locale,port_locale)

    Aprs tentative de connexion, si tout va b ien, le serveur accepte la connexion du client, et reoit un nouveau s ocket qui estdirectement li au mme 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 mthode accept().

    La mthode accept() reste bloquante tant qu'elle n'a pas dtect de connexion.

    Afin d'viter une attente infinie, il est possible de spcifier un dlai maximal d'attente l'aide d'un mutateur setSoTimeout.

    Si un timeout est une valeur strictement positive, l'appel accept()va gnrer une attente maximale gale timeout. Si ce tempsexpire, une exception de typeInterruptedIOException est leve sans toute fois que la socket de type ServerSocketne so itinvalide. La lecture de ce timeout se fait l'aide de l'accesseurgetSoTimeout() .

    Ct client, s i la connexion est accepte, 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 typeIOException .

    Introduction aux sockets 6/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    7/23

    On va es sayer d'tablir une communication. Vous avez tout les lments porte de main, vous pouvez dsormais tablir uneconnexion, au boulot !

    ...Ce n'tait pas si difficile que a, voyons la correction

    Le client et le serveur peuvent prsent communiquer par l'criture ou la lecture de leurs prises .

    Secret (cliquez pour afficher)

    Serveur.java

    Code : Java

    importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;

    publicclassServeur{

    publicstaticvoidmain(String[]zero){

    ServerSocket socketserver ; Socket socketduserveur ;

    try{

    socketserver =newServerSocket(2009); socketduserveur =socketserver.accept();

    System.out.println("Un zro s'est connect !"); socketserver.close();

    socketduserveur.close();

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

    }

    Client.java

    Code : Java

    importjava.io.IOException;importjava.net.InetAddress;importjava.net.Socket;importjava.net.UnknownHostException;

    publicclassClient{publicstaticvoidmain(String[]zero){

    Socket socket;

    try{socket =newSocket(InetAddress.getLocalHost(),2009);

    socket.close();

    }catch(UnknownHostException e){

    Introduction aux sockets 7/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#
  • 5/28/2018 173544 Introduction Aux Sockets

    8/23

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

    e.printStackTrace(); }}

    }

    Lancez le serveur en premier et ensuite le client !

    Vous venez d'tablir votre premire 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 mme 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 rcuprer le flux d'entre et de sortie de la connexionTCP vers le serveur. Il existe deux mthodes pour permettre la rcupration des flux :

    getInputStream()de la classeInputStream. Elle nous permet de grer les flux entrant ;getOutputStream()de la class e OuputStream. Elle nous permet de grer les flux sortant.

    Ces deux mthodes nous permettent donc de grer les flux en entre et en s ortie. En gnral le type d'entre et s ortie utilis estBufferedReaderetInputStreamReaderpour la lecture,PrintWriterpour l'criture. Mais on peut u tiliser tous les autres flux.

    En se basant sur l'annexe du tuto Java :

    BufferedReader: cette class e permet de lire des caractres partir d'un flux tamponn, afin de faire des lectures plusrapides ;

    InputStreamReader: convertit un flux binaire en flux de caractres : elle convertit un objet de typeInputStreamen objetde typeReader;

    PrintWriter : la classe PrintWriter ajoute un flux la possibilit de faire des critures sous forme de texte des typesprimitifs Java, et des chanes de caractres.

    Un petit exemple de communication en image et en code source :

    Introduction aux sockets 8/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    9/23

    Serveur.java

    Code : Java

    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.InetAddress;importjava.net.ServerSocket;importjava.net.Socket;importjava.net.UnknownHostException;importjava.io.PrintWriter;

    publicclassServeur{publicstaticvoidmain(String[]zero){

    ServerSocket socketserver ; Socket socketduserveur ; BufferedReader in; PrintWriter out;

    try{

    socketserver =newServerSocket(2009); System.out.println("Le serveur est l'coute du port"+socketserver.getLocalPort()); socketduserveur =socketserver.accept();

    System.out.println("Un zro s'est connect"); out =newPrintWriter(socketduserveur.getOutputStream());

    out.println("Vous tes connect zro !"); out.flush();

    socketduserveur.close(); socketserver.close();

    }catch(IOException e){

    Introduction aux sockets 9/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    10/23

    e.printStackTrace();

    }}

    }

    Client.java

    Code : Java

    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.InetAddress;importjava.net.Socket;importjava.net.UnknownHostException;

    publicclassClient{publicstaticvoidmain(String[]zero){

    Socket socket; BufferedReader in; PrintWriter out;

    try{

    socket =newSocket(InetAddress.getLocalHost(),2009);

    System.out.println("Demande de connexion");

    in =newBufferedReader (newInputStreamReader(socket.getInputStream())); String message_distant =in.readLine(); System.out.println(message_distant);

    socket.close();

    }catch(UnknownHostException e){

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

    e.printStackTrace(); }}

    }

    Rsultat chez le serveur :

    Code : Console

    Le serveur est l'coute du port 2009

    Un zro s'est connect

    Rsultat chez le clien t :

    Introduction aux sockets 10/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    11/23

    Code : Console

    Demande de connexionVous tes connect zro !

    Ho l ! Un instant ! C'est quoi, ces encapsulationset ceflush?

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

    Ct Serveur

    Aprs tabliss ement de la connexion, le serveur obtient son socket qu'il utilise pour grer le flux sortant l'aide desock etduserveur.getOutputStream() ; ensuite, l'aide de la mthodeprintln on envoie un message au client, on u tiliseflushpour vider le buffertout s implement. Et pour finir on ferme la connexion.

    Ct Client

    Aprs avoir obtenu notre socket, on utilisesock et.get InputStream()pour rcuprer le flux sortant. La mthode readLine()nouspermet de lire une chane de caractres. Il existe plusieurs autres mthodes telles :

    readInt()permettant de lire un entier ;readDouble()permettant de lire un nombre de type double;

    Pour finir, on affiche le message reu et on ferme notre socket.

    a a l'air trs simple premire vue pour deux htes, mais si l'on veut que plus que deux puissent communiquer entre eux lafois, comment faire ? D'o la ncessit 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 nosprogramme, on va donc attaquer directement la pratique.

    Le principe d'utilisation des Threads est simple (sera s imple si vous suivez attentivement :D). Aprs avoir crer un objetServerSocketpar le serveur, on le place (l'objet) comme paramtre un constructeur de la classe qui implmente la classe

    Runnable ou tend la classe Thread, ds 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 11/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    12/23

    Serveur.java

    Code : Java

    importjava.io.IOException;importjava.net.*;

    publicclassServeur{

    publicstaticvoidmain(String[]zero){

    ServerSocket socket; try{

    socket =newServerSocket(2009); Thread t =newThread(newAccepter_clients(socket)); t.start(); System.out.println("Mes employeurs sont prts !");

    }catch(IOException e){

    e.printStackTrace(); }}}

    classAccepter_clientsimplementsRunnable {

    privateServerSocket socketserver; privateSocket socket; privateintnbrclient =1; publicAccepter_clients(ServerSocket s){ socketserver =s; }publicvoidrun(){

    try{ while(true){ socket =socketserver.accept();// Un client se connecte onl'accepte System.out.println("Le client numro "+nbrclient+

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

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

    Introduction aux sockets 12/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    13/23

    } }

    }

    Client.java

    Code : Java

    importjava.io.IOException;importjava.net.*;

    publicclassClient{

    publicstaticvoidmain(String[]zero){

    Socket socket; try{ socket =newSocket("localhost",2009); socket.close(); }catch(IOException e){

    e.printStackTrace(); }}}

    Rsulats :

    Code : Console

    Mes employeurs sont prts !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. Ds 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 !

    prsent que nous savons su manier les s ockets en utilisant les threads, ralisons un petit programme client / serveur : aprs laconnexion du client, celui-ci devra s'authentifier en premier, le serveur va vrifier dans un fichier la validit de ses donnes ; sitout est O.K., un message lui dira qu'il est connect, ils pourront ensuite envoyer tous leurs mess ages au serveur. Voil : trssimple.

    On devra avoir quelque chose de ce genre ct serveur, pour plusieurs clients la fois :

    Code : Console

    Le serveur est l'coute du port 2009Un zro veut se connectersoftdeath vient de se connectersoftdeath : salut, M. le serveur, j'ai besoin de vos services.

    Introduction aux sockets 13/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    14/23

    Un zro veut se connecterchabanus vient de se connectechabanus : salut, j'ai besoin d'accder telles donnes.

    et du ct du client, tte--tte avec le serveur aprs connexion :

    Code : Console

    Demande de connexionConnexion tablie avec le serveur, authentification :Entrez votre login :chabanusEntrez votre mot de passe :chabanusJe suis connectVotre message :salutLe serveur vous dit : salut

    Votre message :a va ?Le serveur vous dit : bien et toi ?

    Allez au boulot !

    J'espre 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 threadsdoivent tregrs.Voyons la correction :

    Ct Serveur

    Secret (cliquez pour afficher)

    Accepter_connexion.java

    Code : Java

    importjava.io.*;importjava.net.*;

    publicclassAccepter_connexionimplementsRunnable{

    privateServerSocket socketserver =null;privateSocket socket =null;

    publicThread t1;publicAccepter_connexion(ServerSocket ss){ socketserver =ss;}

    publicvoidrun(){

    try{ while(true){

    socket =socketserver.accept(); System.out.println("Un zro veut se connecter ");

    Introduction aux sockets 14/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#
  • 5/28/2018 173544 Introduction Aux Sockets

    15/23

    t1 =newThread(newAuthentification(socket));

    t1.start();

    } }catch(IOException e){

    System.err.println("Erreur serveur");

    }}

    }

    Authentification .java

    Code : Java

    importjava.net.*;importjava.util.NoSuchElementException;importjava.util.Scanner;

    importjava.io.*;

    publicclassAuthentificationimplementsRunnable {

    privateSocket socket;privatePrintWriter out =null;privateBufferedReader in =null;privateString login ="zero",pass = null;publicbooleanauthentifier =false;publicThread t2;publicAuthentification(Socket s){ socket =s; }

    publicvoidrun(){

    try{

    in =newBufferedReader(newInputStreamReader(socket.getInputStream())); out =newPrintWriter(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 =newThread(newChat_ClientServeur(socket,login)); t2.start();

    }catch(IOException e){

    System.err.println(login+" ne rpond pas !");

    Introduction aux sockets 15/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    16/23

    }

    privatestaticbooleanisValid(String login,String pass){

    booleanconnexion =false; try{

    Scanner sc =newScanner(newFile("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 !");

    }returnconnexion;

    }

    }

    Chat_ClientServeur.java

    Code : Java

    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.Socket;

    publicclassChat_ClientServeurimplementsRunnable {

    privateSocket socket =null;privateBufferedReader in =null;privatePrintWriter out =null;privateString login ="zero";privateThread t3,t4;

    publicChat_ClientServeur(Socket s,String log){

    socket =s; login =log;}publicvoidrun(){

    try{ in =newBufferedReader(newInputStreamReader(socket.getInputStream())); out =newPrintWriter(socket.getOutputStream());

    Thread t3 =newThread(newReception(in,login)); t3.start(); Thread t4 =newThread(newEmission(out));

    t4.start();}catch(IOException e){

    System.err.println(login +"s'est dconnect "); }}}

    Introduction aux sockets 16/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    17/23

    Emission .java

    Code : Java

    importjava.io.IOException;importjava.io.PrintWriter;

    importjava.util.Scanner;

    publicclassEmissionimplementsRunnable {

    privatePrintWriter out;privateString message =null;privateScanner sc =null;publicEmission(PrintWriter out){ this.out=out;}

    publicvoidrun(){

    sc =newScanner(System.in);

    while(true){ System.out.println("Votre message :"); message =sc.nextLine(); out.println(message); out.flush(); }}}

    Reception.java

    Code : Java

    importjava.io.BufferedReader;importjava.io.IOException;

    publicclassReceptionimplementsRunnable {

    privateBufferedReader in;privateString message =null,login =null;

    publicReception(BufferedReader in,String login){

    this.in=in; this.login=login;}publicvoidrun(){while(true){

    try{

    message =in.readLine(); System.out.println(login+" : "+message);

    }catch(IOException e){

    e.printStackTrace(); } }}

    Introduction aux sockets 17/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    18/23

    }

    Serveur.java

    Code : Java

    importjava.io.*;importjava.net.*;

    publicclassServeur{publicstaticServerSocket ss =null;publicstaticThread t;

    publicstaticvoidmain(String[]args){

    try{ ss =newServerSocket(2009); System.out.println("Le serveur est l'coute du port

    "+ss.getLocalPort());t =newThread(newAccepter_connexion(ss));

    t.start();

    }catch(IOException e){ System.err.println("Le port "+ss.getLocalPort()+" est djutilis !"); }}

    }

    Ct Client

    Secret (cliquez pour afficher)

    Chat_ClientServeur.java

    Code : Java

    importjava.io.*;importjava.net.*;importjava.util.Scanner;

    publicclassChat_ClientServeurimplementsRunnable {

    privateSocket socket;privatePrintWriter out =null;privateBufferedReader in =null;privateScanner sc;privateThread t3,t4;

    publicChat_ClientServeur(Socket s){ socket =s;}publicvoidrun(){ try{

    Introduction aux sockets 18/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-3-173544-introduction-aux-sockets.html?pdf=1#
  • 5/28/2018 173544 Introduction Aux Sockets

    19/23

    out =newPrintWriter(socket.getOutputStream()); in =newBufferedReader(newInputStreamReader(socket.getInputStream()));

    sc =newScanner(System.in);

    Thread t4 =newThread(newEmission(out)); t4.start();

    Thread t3 =newThread(newReception(in)); t3.start();

    }catch(IOException e){ System.err.println("Le serveur distant s'est dconnect !"); }}

    }

    Client.javaCode : Java

    importjava.io.*;importjava.net.*;

    publicclassClient{

    publicstaticSocket socket =null;publicstaticThread t1;publicstaticvoidmain(String[]args){

    try{

    System.out.println("Demande de connexion"); socket =newSocket("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 =newThread(newConnexion(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.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    20/23

    importjava.net.*;importjava.util.Scanner;importjava.io.*;

    publicclassConnexionimplementsRunnable {

    privateSocket socket =null;publicstaticThread t2;

    publicstaticString login =null,pass =null,message1 =null,message2 =null,message3 =null;privatePrintWriter out =null;privateBufferedReader in =null;privateScanner sc =null;privatebooleanconnect =false;publicConnexion(Socket s){

    socket =s;}publicvoidrun(){

    try{

    out =newPrintWriter(socket.getOutputStream()); in =newBufferedReader(newInputStreamReader(socket.getInputStream()));

    sc =newScanner(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 =newThread(newChat_ClientServeur(socket));

    t2.start();

    }catch(IOException e){

    System.err.println("Le serveur ne rpond plus "); }}

    }

    Emission.java

    Code : Java

    Introduction aux sockets 20/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    21/23

    importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Scanner;

    publicclassEmissionimplementsRunnable {

    privatePrintWriter out;

    privateString login =null,message =null;privateScanner sc =null;publicEmission(PrintWriter out){ this.out=out;}

    publicvoidrun(){

    sc =newScanner(System.in);

    while(true){ System.out.println("Votre message :"); message =sc.nextLine(); out.println(message); out.flush(); }}}

    Reception.java

    Code : Java

    importjava.io.BufferedReader;importjava.io.IOException;

    publicclassReceptionimplementsRunnable {

    privateBufferedReader in;privateString message =null;publicReception(BufferedReader in){

    this.in=in;}

    publicvoidrun(){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.openclassrooms.com

    http://fr.openclassrooms.com/
  • 5/28/2018 173544 Introduction Aux Sockets

    22/23

    Lancez serveur.javaet ens uite client.java, n'oubliez pas de crer un fichier pour le serveur pour qu'il puisse y vrifier 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 possibilits 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 raliser un salon , comme on l'appelle ;utiliser les bas es de donnes pour la sauvegarde des messages et pour authentifier les clients ;raliser une interface graphique enswingou en awt;

    Croyez-moi : lorsque vous matriserez les sockets en utilisant les threads, rien ne sera plus compliqu pour vous . Bonne

    continuation tous ; surtout n'hsitez pas l'amliorer et envoyez-moi un MP pour m'exposer votre travail.

    Q.C.M.

    Le premier QCM de ce cours vous est offert en libre accs.

    Pour accder aux suivants

    Connectez-vousInscrivez-vousQuelle est la classe qui permet de crer un socket pour le serveur ?

    SocketServer.

    ServeurSocket.

    SocketServeur.

    ServerSocket.

    Un client peut crer plusieurs sockets.

    Vrai.

    Faux.

    Qu'est-ce qui cloche dans ce code ?

    Code : Java

    try{ ServerSocket ss=newServerSocket(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 rserv.

    Correction !

    Statistiques de rponses au QCM

    Le mode UDP est plus rapide que le mode TCP mais c'est une communication non fiable, car on ne se proccupe pas du rsultatde la rception du rcepteur, il est donc moins utilis. Maintenant que vous savez manier les sockets, le mode UDP ne devrait

    pas vous poser de problme .

    Introduction aux sockets 22/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.v3.siteduzero.com/tutoriel-15-173544.htmlhttp://www.v3.siteduzero.com/inscriptionhttp://www.v3.siteduzero.com/connexion
  • 5/28/2018 173544 Introduction Aux Sockets

    23/23

    Je vous remercie d'avoir lu le tutoriel, il est prsent termin. J'espre que vous avez bien suivi

    la prochaine pour un autre tutoriel client/s erveur ! La technologie RMI (Remote Method Invocation) ! Qui vous permettra demieux comprendre la nature et la fonction des EJB (Entreprise JavaBeans) qui reprsente l'tendard de la plate-forme J2EE !

    Je remercie :

    Le membre cysboypour m'avoir encourag.Les validateurs Xavinou, Coyote et Thunderseb.Le zCorrecteur Poulpettepour avoir pris le temps de corriger le tutoriel.Enfin, tout le s taff du site du zroqui nous permet de rdiger des tutoriels pour dbutants.

    Partager

    Ce tutoriel a t corrig par les zCorrecteurs.

    Introduction aux sockets 23/24

    www.openclassrooms.com

    http://fr.openclassrooms.com/http://www.zcorrecteurs.fr/http://www.v3.siteduzero.com/tutoriel-rss/173544.xmlhttp://www.siteduzero.com/http://www.siteduzero.com/membres-294-7888.htmlhttp://www.siteduzero.com/membres-294-1398.htmlhttp://www.siteduzero.com/membres-294-1084.htmlhttp://www.siteduzero.com/membres-294-51570.htmlhttp://www.siteduzero.com/membres-294-875.html