Vous êtes sur la page 1sur 56

PROGRAMMATION RÉSEAUX ET SERVICES WEB

CHAPITRE 3

Les Sockets

4ème année IRIIA


Dr. Boubiche S
DÉFINITION
 Les protocoles de la couche transport permettent une communication point à point fiable. En utilisant
ces protocoles, le client et le serveur doivent établir une connexion afin de communiquer. Pour ce faire,
chaque application lie une socket à son extrémité de la connexion.

 Le terme socket signifie douille, prise électrique sur quoi on branche quelque chose.

 Une socket est un point d'extrémité d'une liaison de communication bidirectionnelle entre deux
programmes s'exécutant sur le réseau.

‘’ Les sockets sont les terminaisons des connexions


et peuvent être utilisées
pour envoyer et recevoir des données.’’
DÉFINITION

 Une socket est liée à un numéro de port afin


que la couche TCP puisse identifier l'application
à laquelle les données doivent être envoyées.

 Le numéro de port est utilisé comme


emplacement du serveur sur la machine sur
laquelle l'application serveur s'exécute.

 Le client et le serveur peuvent alors lire et


écrire chacun vers la socket liée à son extrémité
du lien.
CONCEPTION

 Pour faciliter leur utilisation, les sockets sont conçues en respectant la sémantique des E/S du système :

1, Ouverture : ‘’Création Socket 3, Fermeture : ‘’Détruire sockets et canal,


et canal de communication.’’ et libérer les ressources.’’

2, Lecture/Ecriture : ‘’Envoi
Et réception.’’
NIVEAUX D’ABSTRACTION

‘‘Socket est au plus bas niveau.’’ SOAP, Java RMI Application

Présentation

RPC Session
Socket: Envoi de messages.
Socket
Transport
RPC: Appel de procédures.
Réseau
Java RMI: Invocation de méthodes.
Liaison
SOAP: Envoi de services.
Physique
LES SOCKETS EN JAVA

SOCK_STREAM

SOCK_DGRAM
COMMUNICATION BASÉE SUR LES SOCKETS
1.’’Le serveur commence par créer ServerSocket 4.‘’ Le serveur crée une nouvelle socket
pour recevoir les demandes de connexion.’’ qui sera l’une des extrémités de la connexion.’’

2.’’Le serveur se met en attente 5.‘’ Le client obtient la socket qui est la
des demandes de connexion.’’ deuxième extrémité de la connexion.’’

3.‘’ Le client demande une connexion 6.‘’ Le client et le serveur créent les
Serveur
à travers le port associé au service.’’ Entrées et sorties associées ServerSocket(port)
aux deux sockets.’’

Socket(‘Serveur’,port)

ServerSocket: server
Client server.accept() App S

Socket : s
App C is Socket : s
os is
s.getInputStream os
s.getInputStream
s.getOutputStream
s.getOutputStream
COMMUNICATION BASÉE SUR LES SOCKETS
1.’’Le serveur commence par créer une ServerSocket 4.‘’ Le serveur crée une nouvelle socket
pour recevoir les demandes de connexion.’’ qui sera l’une des extrémités de la connexion.’’

2.’’Le serveur se met en attente 5.‘’ Le client obtient la socket qui est la
des demandes de connexion.’’ deuxième extrémité de la connexion.’’

3.‘’ Le client demande une connexion 6.‘’ Le client et le serveur créent les Serveur
à travers le port associé au service.’’ entrées et sorties associées
aux deux sockets.’’

7.‘’ Le client et le serveur commencent les


échanges de données à travers les sockets.’’

ServerSocket: ss
Client ss.accept() App S

Socket : s
App C is Socket : s
os is
is.read() os
os.write(…) is.read()
os.write(…)
JAVA.NET

 Le package java.net fournit les classes pour l'implémentation des applications réseau.

 Le package java.net peut être grossièrement divisé en deux sections :

 API de bas niveau, qui traite les abstractions suivantes :

o Les adresses, qui sont des identifiants de réseau, comme les adresses IP.

o Les sockets, qui sont des mécanismes de communication de données bidirectionnels de base.

 API de haut niveau.

 L'interface Java des sockets offre un accès simple aux sockets.


JAVA.NET.INETADDRESS

 La classe java.net.InetAddress permet de manipuler des adresses IP. Dans le cas le plus simple, cette
classe est utilisée pour connaître l'adresse IP à partir d'un nom d'hôte, et vice-versa.

‘’contient des méthodes


pour lire une adresse, la comparer avec une autre
ou la convertir en chaîne de caractères.’’
JAVA.NET.INETADDRESS

 InetAddress getLocalHost() : Retourne un objet contenant l'adresse Internet et le nom de la


machine locale.

 String getHostAddress() obtient l'adresse IP sous forme %d.%d.%d.%d.

 String getHostName() obtient le nom complet correspondant à l'adresse IP.

o Exemple:
InetAddress adrLocale= InetAddress.getLocalHost();
System.out.println("Adresse locale: " + adrLocale.getHostAddress());
System.out.println("Nom: " + id.getHostName());
JAVA.NET.INETADDRESS

 InetAddress.getByName(String id) : Retourne un objet contenant l'adresse Internet de la


machine dont le nom est passé en paramètre.

o Exemple :

InetAddress adrServeur = InetAddress.getByName("localhost");


System.out.println("Adresse hôte: " + adrServeur.getHostAddress());
JAVA.NET.INETADDRESS

 InetAddress[] getAllByName(String id) : Retourne l'ensemble des adresses Internet de la


machine qui répond au nom passé en paramètre.

o Exemple :
InetAddress [] adrServeurs= InetAddress.getAllByName("www.sun.com");
for (int i=0; i<adrServeurs.length;i++)
{
System.out.println("Adresse Serveur: "+ i +"= "+adrServeurs[i].getHostAddress());
}
JAVA.NET.INETADDRESS

 byte[] getAddress() Retourne l'adresse internet stockée dans l'objet sous forme d'un tableau de 4
octets dans l'ordre réseau.

o Exemple :

InetAddress addr = InetAddress.getByName("localhost");


byte[] x = addr.getAddress();

for(int i=0; i<x.length; i++) {


System.out.println("x[" +i+ "]=" + x[i]);
}
JAVA.NET.INETADDRESS

‘’ Les fonctions précédentes


peuvent lever une exception
UnknownHostException ‘’ Elle est levée pour indiquer que l'adresse IP
.’’ d'un hôte n'a pas pu être déterminée.’’
CLASSE JAVA.NET.SERVERSOCKET

 Si l’on souhaite créer un serveur, la première chose à créer est l’objet ServerSocket
appartenant à la classe ServerSocket.

 Un objet ServerSocket est un objet qui permet d’ouvrir un service d’écoute sur le
réseau (il écoute le réseau) et attend qu’un client demande une connexion.

 Implante un objet du type Socket qui prend en charge la transmission des données.
CLASSE JAVA.NET.SERVERSOCKET

o Constructeurs :

ServerSocket(int port) ‘’Crée un objet serveur


à l'écoute du port spécifié.’’

ServerSocket(int port, int backlog) ‘’Spécifie la taille


de la file d'attente des demandes de connexion.’’

ServerSocket(int port, int backlog, InetAddress bindAddr) ‘’Si la machine


possède plusieurs adresses, restreindre l'adresse
sur laquelle les connexions sont acceptées.’’
Client Serveur

ServerSocket ser = new ServerSocket (1122);

ser:ServerSocket
port : 1122
CLASSE JAVA.NET.SERVERSOCKET

o Méthodes :

Socket accept() ‘’accepte une


connexion entrante. Méthode
bloquante.’’

close() ‘’ferme la socket.’’

InetAddress getInetAddress() ‘’retourne


l’adresse du serveur.’’

int getLocalPort() ‘’retourne le port sur


lequel le serveur écoute.’’
Client Serveur

ServerSocket ser = new ServerSocket (1122);

Socket socket = ser.accept();

ser:ServerSocket

port : 1122
accept():Socket
CLASSE JAVA.NET.SOCKET

 Gère la connexion à une machine distante du réseau, l'envoi de données, la réception


de données et la déconnexion.

 Contient les méthodes de création des flux d'entrée et de sortie. Les sockets
constituent la base des communications par le réseau.
CLASSE JAVA.NET.SOCKET

o Constructeurs :
Socket(String host, int port)
‘’Construit une nouvelle Socket. Le nom et le port
sont fournis en paramètres.’’

Socket(InetAddress address, int port)


‘’Construit une nouvelle socket sur la machine
dont l'adresse IP et le port sont fournis en paramètres .’’

o Exceptions :
UnknownHostException ‘’si la machine hôte
n’existe pas.’’

IOException ‘’s’il n’y a pas d’application serveur


démarrée sur le port p.’’
CLASSE JAVA.NET.SOCKET

o Méthodes :

void close() ‘’fermeture de la


socket.’’

void shutDownInput() ‘’fermeture de la socket pour la lecture.’’

void shudownOutput() ’‘fermeture de la


socket pour l’écriture.’’
CLASSE JAVA.NET.SOCKET

o Méthodes :

InetAddress getLocalAddress() ‘’
adresse de la machine hôte.’’

InetAddress geInetAddress() ‘’adresse de la machine


à laquelle on est connecté.’’

int getLocalPort() ’‘le port local.’’

int getPort() ’‘le port sur la machine


distante.’’
CLASSE JAVA.NET.SOCKET

 La communication sur une connexion par socket utilise la notion de flots de données :

‘’java.io.InputStream’’ ‘’java.io.OutputStream’’

o Méthode :

InputStream getInputStream() OutputStream getOutputStream()

‘’ InputStream est habillé par : ‘’ OutputStream est habillé par :

InputStreamReader, BufferedReader.’’ PrintWriter.’’


Client Serveur

ServerSocket ser = new ServerSocket (1122);

Socket socket = ser.accept();

InputStream i = socket.getInputStream();
OutputStream o = socket.getOutputStream();
ser:ServerSocket
int entree=i.read();
Int rep= ……; port : 1122
o.write(rep);
accept():Socket

socket:Socket
read
i getInputStream()
o getOutputStream()
write
Client Serveur

ServerSocket ser = new ServerSocket (1122);

Socket socket = new Socket (‘’@ip machine’’, 1122);


Socket socket = ser.accept();

InputStream i = socket.getInputStream();
InputStream i = socket.getInputStream(); OutputStream o = socket.getOutputStream();
OutputStream o = socket.getOutputStream();
ser:ServerSocket
int entree=i.read();
o.write(….); Int rep= ……; port : 1122
int rep=i.read(); o.write(rep);
System.out.println(rep); accept():Socket

connexion
socket:Socket socket:Socket
read
getInputStream() o i getInputStream()
getOutputStream() i o getOutputStream()
write
EXEMPLE 1 (CONNEXION AU SERVEUR)

Etapes à réaliser côté serveur : Etapes à réaliser côté Client :

1. Création de l'objet Serveur. 1. Afficher un message de connexion au serveur.

2. Afficher un message d’attente d’un client. 2. Connexion au serveur.

3. Attente de la connexion d'un client.

4.Afficher un message lorsque le client est connecté.


EXEMPLE 1 (CONNEXION AU SERVEUR)

public class Serveur { public class Client {

public static void main(String[] args) throws IOException { public static void main(String[] args) throws
//Création de l'objet Serveur UnknownHostException, IOException {

ServerSocket ser= new ServerSocket(1122); System.out.println(‘’Je me connecte au serveur");

System.out.println("Attente d'une connexion d'un client"); Socket socket= new Socket("localhost",1122);


}
// Attente de la connexion d'un client
Socket socket =ser.accept(); }
System.out.println("Client connecté");
}

}
EXEMPLE 2 (MANIPULATION D’UN NOMBRE)

Etapes à réaliser côté serveur : Etapes à réaliser côté Client :

1. Création de l'objet Serveur. 1. Afficher un message de connexion au serveur.

2. Afficher un message d’attente d’un client. 2. Connexion au serveur.

3. Attente de la connexion d'un client. 3. Création des E/S.

4.Afficher un message lorsque le client est connecté. 4. Saisie d’un nombre.

5. Création des E/S. 5. Envoi du nombre.

6.Attente d’un nombre. 6. Attente du résultat.

7. Manipulation du nombre. 7. Affichage du résultat.

8. Envoi du résultat.
EXEMPLE 2 (MANIPULATION D’UN NOMBRE)

Serveur Client

ServerSocket ser= new ServerSocket(1122); System.out.println(‘’Connectint to the server");


System.out.println("Waiting for a client"); Socket socket= new Socket("localhost",1122);
Socket socket =ser.accept(); InputStream i = socket.getInputStream();
System.out.println("Client connected"); OutputStream o = socket.getOutputStream();
InputStream i = socket.getInputStream(); Scanner scanner = new Scanner(System.in);
OutputStream o = socket.getOutputStream(); System.out.println(‘’Give a number : ");
System.out.println("waiting for a number"); int nombre = scanner.nextInt();
int nombre = i.read(); System.out.println(‘’Sending the number: "+ nombre +
System.out.println("The received number: " + nombre); " to the server");
int resultat = nombre*10; o.write(nombre);
System.out.println("Sending the result: " + resultat); System.out.println(‘’Waiting for a response from the
o.write(resultat); server");
int reponse=i.read();
System.out.println(‘’Response : "+ reponse + " received
from the server");
TYPES PRIMITIFS DES DONNÉES

Lecture Ecriture
Type primitif Lecture Ecriture
InputStream OutputStream
Integer readInt() writeInt()
read():int write(int var)
Float readFloat() writeFloat()

Double readDouble() writeDouble()


DataInputStream DataOutputStream Long readLong() writeLong()

read():type write(type var) String readUTF() writeUTF()


EXEMPLE 3 (MANIPULATION D’UN NOMBRE)

Serveur Client
ServerSocket ser= new ServerSocket(1122); System.out.println(‘’Je me connecte au serveur");
System.out.println("Waiting for a client"); Socket socket= new Socket("localhost",1122);
Socket socket =ser.accept();
System.out.println("Client connecté"); DataInputStream i = new
DataInputStream(socket.getInputStream());
DataInputStream i = new DataOutputStream o = new
DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream());
DataOutputStream o = new
DataOutputStream(socket.getOutputStream()); Scanner scanner = new Scanner(System.in);
System.out.println(‘’Donner un nombre : ");
System.out.println("Attente d’un nombre du client"); Int nombre = scanner.nextInt();
int nombre = i.readInt(); System.out.println(‘’J’envoi le nombre: "+ nombre + " au
System.out.println("J’ai reçu le nombre du client" + serveur");
nombre); o.writeInt(nombre);
int resultat = nombre*10; System.out.println(‘’J’attends la réponse du serveur");
System.out.println("J’envoi le résultat" + resultat); Int reponse=i.readInt();
o.writeInt(resultat); System.out.println(‘’J’ai reçu la réponse: "+ reponse );
COMMUNICATION PAR FLOTS DE CARACTÈRES
Lecture Ecriture

InputStream OutputStream
read():int write(int c)

InputStreamReader PrintWriter
read():int println(String s)

BufferedReader
readLine():String
COMMUNICATION PAR FLOTS DE CARACTÈRES

Exelmple

public class Servers { public class Client {

public static void main(String[] args) throws IOException public static void main(String[] args) throws
{ UnknownHostException, IOException {
ServerSocket server = new ServerSocket(1015); Socket socket = new Socket ("localhost", 1015);
System.out.println("Waiting for a connection");
Socket socket = server.accept();
System.out.println("Connected"); PrintWriter pw = new PrintWriter
(socket.getOutputStream(),true);
InputStreamReader isr= new
InputStreamReader(socket.getInputStream()); pw.println("Hello Server");
BufferedReader bf = new BufferedReader(isr);
String st = bf.readLine(); }

System.out.println("msg received from the client : "+ st ); }


}
}
COMMUNICATION PAR OBJETS
 Sérialisation et désérialisation public class Etudiant implements Serializable {
String nom; int mat;
……………………..
InputStream OutputStream o ObjectOutputStream oos = new ObjectOutputStream
read():int write(int c) (s.getOutputStream);

Etudiant etudiant1 = new Etudiant (‘’Bob’’, 200);


o oos.writeObject (etudiant1);
ObjectInputStream ObjectOutputStream
readObject():Object writeObject(Object o) o ObjectInputStream ois = new ObjectInputStream
(s.getInputStream);

Etudiant e = (Etudiant) ois.readObject();


CLASSE JAVA.NET.SOCKET (OPTIONS)

 TCP_NODELAY :

o void setTcpNoDelay(boolean b) et boolean getTcpNoDelay()

 vrai : implique que les paquets sont envoyés sans délai.

 faux :

• les paquets sont regroupés avant d’être envoyés.

• le système attend de recevoir le message d’acquittement du paquet précédent, avant


d’envoyer le paquet suivant.
CLASSE JAVA.NET.SOCKET (OPTIONS)
Exemple :

Socket socket = new Socket();

boolean on=true;

socket.setTcpNoDelay(on);

System.out.println("The option is enabled: "+socket.getTcpNoDelay());


CLASSE JAVA.NET.SOCKET (OPTIONS)
 SO_LINGER :

o void setSoLinger(boolean b, int s) et int getSoLinger ()

La méthode setSoLinger() active ou désactive l'option SO_LINGER avec le temps


d'attente donné en secondes. Elle indique ce qu’il faut faire des paquets non encore
envoyés lorsque la socket est fermée.

 vrai : la fermeture de la socket bloque pendant s secondes, pendant lesquelles les


données peuvent être envoyées, et les acquittements reçus.

 faux : la socket est fermée immédiatement, et les paquets non envoyés sont perdus.
CLASSE JAVA.NET.SOCKET (OPTIONS)
Exemple :

int timeout=90;

socket.setSoLinger(true,timeout);

System.out.println("Timeout value: "+socket.getSoLinger());


CLASSE JAVA.NET.SOCKET (OPTIONS)

 SO_TIMEOUT:

o void setSoTimeout(int timeout) et int getSoTimeout()

 La méthode setSoTimeout () active ou désactive l'option SO_TIMEOUT avec


une valeur de délai d'attente donnée en millisecondes.

 La valeur du délai d'attente doit être supérieure à 0, sinon une erreur sera
générée.
CLASSE JAVA.NET.SOCKET (OPTIONS)
Exemple :

int timeout=90987789;

socket.setSoTimeout(timeout);

System.out.println("Timeout value: "+socket.getSoTimeout());


LES SOCKETS EN MODE NON CONNECTÉ
SOCKET MODE NON CONNECTÉ

‘’ Classe DatagramPacket.’’ ‘’ Classe DatagramSocket.’’


‘’ Implémentent les connexions
UDP.’’

‘’ L’objet DatagramPacket est le ‘’C’est le mécanisme utilisé pour envoyer


conteneur des données.’’ ou recevoir les DatagramPackets.’’

‘’Les objets DatagramSocket sont


‘‘L’émetteur envoi son trafic UDP via utilisés pour créer des sockets à travers
des paquets Datagram au récepteur.’’ lesquels le trafic UDP peut être
transmis en tant qu'objets
DatagramPacket.’’
CLASSE JAVA.NET.DATAGRAMSOCKET

o Constructeur :

DatagramSocket(int port)

‘’ Construit une socket datagramme en l’associant à un port.’’

 L’exception SocketExcpetion peut être levée.


CLASSE JAVA.NET.DATAGRAMSOCKET

o Méthodes :
void send(DatagramPacket p) int getLocalPort()
‘’ Pour l’émission des paquets. ‘’retourne le port sur lequel on écoute,
IOException’’ ou le port anonyme sur lequel on a envoyé
le paquet.’’

void receive(DatagramPacket p) InetAddress getInetAddress()


‘Pour la réception des paquets.’’ ‘’retourne l’adresse à laquelle on est
connecté.’’

void close() int getPort()


‘’fermeture de la socket.’’ ’‘retourne le port auquel on est
connecté.’’
CLASSE JAVA.NET.DATAGRAMPACKET

o Constructeurs :

DatagramPacket (byte[] buf, int length, InetAddress ia, int port)

‘’ construit un datagramme destiné à être envoyé à l’adresse


ia, sur le port port.

le tampon buf de longueur length contient les octets à


envoyer.’’
DatagramPacket (byte[] buf, int length)

‘’ construit un datagramme destiné à


recevoir des données.

le tampon buf de longueur length


contient les octets à recevoir.’’
CLASSE JAVA.NET.DATAGRAMPACKET

o Méthodes :
byte[] getData() int getLength()
‘‘Renvoie le tampon de données.’’ ‘’retourne la taille du tableau des données
reçues.’’

void setData(byte[] data) void setLength(int length)


‘’change le tableau des données à envoyer.’’ ’‘change la taille du tableau des données à
envoyer.’’

InetAddress getAddress()
int getPort() ‘’retourne le port de l’hôte
‘’retourne l’adresse de l’hôte d’où
qui a envoyé, ou vers lequel on envoie.’’
vient ou où va le paquet.’’
void setPort(int port)
void setAddress(InetAddress ia) ’‘change le port vers lequel on envoie le
‘’change l’adresse où envoyer le paquet.’’ paquet.’’
EXEMPLE : ENVOI DE PAQUETS UDP AU SERVEUR

Serveur Client

//Création d’une socket pour écouter sur le port //Création d’une socket
DatagramSocket ds=new DatagramSocket(1122); DatagramSocket ds=new DatagramSocket();

//Définir un buffer de réception //Création du message à envoyer


byte b[]=new byte[1024]; String s="Algeria is a good country";

//Associer un paquet à un buffer vide pour la réception. byte b[]=s.getBytes();


DatagramPacket dp=new DatagramPacket(b,b.length);
//Initialisation du paquet avec toutes les informations
//Attente de réception. DatagramPacket dp=new
ds.receive(dp); DatagramPacket(b,b.length,InetAddress.getLocalH
ost(),1122);
//Réception et affichage.
String r=new String(dp.getData()); //Envoi du paquet
ou String r=new String(dp.getData(),0,dp.getLength()); ds.send(dp);
System.out.println(r);
SERVEUR MULTI-THREADS
THREADS

Processus 1 Processus 2

Thread1 Thread2 Thread3 Thread1 Thread2 Thread3

 Deux techniques pour créer un thread en java :


 Dans un processus, on peut lancer des Threads.

o Créer le thread par héritage (dériver le thread


 Permettent d’exécuter plusieurs tâches de la classe java.lang.Thread).
simultanément (chaque tâche dans un thread).
o Créer le thread par composition
(implémenter l’interface java.lang.Runnable).
SERVEUR MULTI-THREADS

 Le serveur doit être capable d’attendre une connexion


à tout moment.

 A chaque connexion d’un client il faut créer un


nouveau thread associé à la socket du client, puis se
mettre en attente d’un nouveau client.

 Les thread créés gèrent les opérations d’E/S pour


communiquer avec les clients indépendamment des
activités du serveur.
Serveur

public class ServerMT extends Thread {

public static void main(String[] args) {


new ServerMT().start();
 Héritage de la classe Thread : utiliser la méthode run()
(Contient les traitements à exécuter).
}

public void run() {


 Création d’un objet de la classe ServerMT et appel de la
try { méthode start(). (permet de créer automatiquement un
ServerSocket server= new ServerSocket (1122); thread et de le démarrer).
while (true) {
Socket socket = server.accept();
 L’appel de la méthode start() fait automatiquement appel à
} la méthode run();
} catch (IOException e) {
 L’attente de la connexion d’un client se fait dans une boucle
e.printStackTrace(); infinie.
}
}
}
Serveur
 Pour chaque client connecté, un thread doit être créé :
public class ServerMT extends Thread {
o Création d’une classe qui hérite de la classe Thread.
public static void main(String[] args) {
new ServerMT().start();
o Création d’un objet de cette classe.
}

public void run() {


o Appel de la méthode start() : la méthode run () de
try { l’objet créé s’exécute.
ServerSocket server= new ServerSocket (1122);
while (true) {
Socket socket = server.accept();
o La communication avec le client se fait dans la
new communication(socket).start(); méthode run() sans bloquer l’application.
}

} catch (IOException e) {
o La socket est transmise à la classe pour qu’elle
puisse communiquer avec le client.
e.printStackTrace();
}
}
class communication extends Thread {
private Socket socket;
public communication (Socket s) {
this.socket=s;
}
public void run() { }
}
}
Serveur

class communication extends Thread {  La création des streams se fait dans la méthode run().
private Socket socket;

public communication (Socket s) {  Une fois le thread démarré, il entre dans une boucle de
this.socket=s; communication (lecture et écriture) :
}

public void run() {


o Une boucle infinie dans laquelle sont effectuées les
InputStreamReader isr = new InputStreamReader
(socket.getInputStream());
lectures et écritures.
BufferedReader bf = new BufferedReader(isr);

PrintWriter pw = new PrintWriter


(socket.getOutputStream(),true);

while (true) {
String reader =bf.readLine();
pw.println(reader.length());
}

}
}
package exemple; class communication extends Thread {
private Socket socket;
import java.io.BufferedReader; private int numclient;
import java.io.IOException; public communication (Socket s, int num ) {
import java.io.InputStreamReader; this.socket=s;
import java.io.PrintWriter; this.numclient=num;
import java.net.ServerSocket; }
import java.net.Socket;
public void run() {
public class ServerMT extends Thread {
try {
private int nbreclients; InputStreamReader isr = new InputStreamReader
(socket.getInputStream());
public static void main(String[] args) { BufferedReader bf = new BufferedReader(isr);
new ServerMT().start(); PrintWriter pw = new PrintWriter
} (socket.getOutputStream(),true);
System.out.println("Connexion du client: "+numclient);
public void run() { pw.println("Bienvenue, voux êtes le client numéro:
try { "+numclient+ " , dites quelque chose: ");
ServerSocket server= new ServerSocket (1122); while (true) {
while (true) { String reader =bf.readLine();
Socket socket = server.accept(); pw.println(reader.length());
++nbreclients; }
new communication(socket, nbreclients ).start();
} } catch (IOException e) {

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


}
e.printStackTrace(); } } }
}

Vous aimerez peut-être aussi