0% ont trouvé ce document utile (0 vote)
0 vues34 pages

5-reseauJava

Le document présente une formation avancée sur la programmation réseau en Java, couvrant les communications par sockets avec les protocoles TCP et UDP, ainsi que l'utilisation des classes java.net pour établir des connexions. Il inclut des exemples pratiques de client-serveur en TCP et UDP, ainsi que des explications sur la gestion des flux de données. Enfin, il aborde la création de liens Internet avec la classe URL et la gestion des connexions HTTP.

Transféré par

dogonokai007
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
0 vues34 pages

5-reseauJava

Le document présente une formation avancée sur la programmation réseau en Java, couvrant les communications par sockets avec les protocoles TCP et UDP, ainsi que l'utilisation des classes java.net pour établir des connexions. Il inclut des exemples pratiques de client-serveur en TCP et UDP, ainsi que des explications sur la gestion des flux de données. Enfin, il aborde la création de liens Internet avec la classe URL et la gestion des connexions HTTP.

Transféré par

dogonokai007
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Java Avance

Programmation réseau

Emmanuel ADAM

Université Polytechnique des Hauts-De-France

UPHF/INSA HdF

E. ADAM UPHF Java Avance UPHF/INSA HdF 1 / 34


Plan

1 Communication par sockets


2 Protocole TCP
Exemple : Client - Serveur TCP
3 Communication par UDP
Exemple : Client - Serveur UDP
4 Liens Internet : URL
5 RMI
Création d’une application distribuée
Exemple d’application
Recherche de classes accessoires
Sécurité
Remarques
6 Communication 1-n (1 serveur - N clients)

E. ADAM UPHF Java Avance UPHF/INSA HdF 2 / 34


Communication par sockets

Communication par sockets


package [Link]

Présentation
Les classes de [Link].* permettent d’établir des flux
d’entrées/sorties entre machines à l’aide de sockets
Il existe deux protocoles utilisant les sockets en Java :
TCP : Stream Socket
Communication en mode connectéS
Les applications sont averties lors de la déconnexion
UDP : Datagram Socket
Communication en mode non connectéS
Plus rapide mais moins fiable que TCP

E. ADAM UPHF Java Avance UPHF/INSA HdF 3 / 34


Protocole TCP

Protocole TCP

Fonctionnement du TCP
Le serveur Le client
Crée une socket .
Attend une connection ←− Demande une connection
Accepte la demande −→ création de socket
Récupération d’un flux et filtrage Récupération d’un flux et filtrage
échange de données échange de données

E. ADAM UPHF Java Avance UPHF/INSA HdF 4 / 34


Protocole TCP

ServerSocket
package [Link]

Présentation
La classe ServerSocket définit une socket sur le serveur.
Pour créer une ServerSocket, il faut lui donner un numéro
de port.
Une fois créée, la socket Serveur attend une connection par la
méthode accept().

S e r v e r S o c k e t s = new S e r v e r S o c k e t ( 8 8 8 8 )
Socket socket = s . accept () ;
// a t t e n t e d ’ une c o n n e c t i o n

E. ADAM UPHF Java Avance UPHF/INSA HdF 5 / 34


Protocole TCP

Socket client
package [Link]

Présentation
Se connecter sur une socket d’un serveur, implique de
connaître son adresse.
InetAddress permet de récupérer une adresse à partir d’un
nom.
La liaison d’une socket à la socket serveur peut alors être
demandée.

I n e t A d d r e s s a d d r = I n e t A d d r e s s . getByName ( " 4 4 . 2 2 . 3 3 . 1 1 " ) ;


S o c k e t s o c k e t = new S o c k e t ( addr , 8 8 8 8 ) ;

E. ADAM UPHF Java Avance UPHF/INSA HdF 6 / 34


Protocole TCP

Communication inter-socket
package [Link]

Communications
Les communication entre socket s’effectue “classiquement”,
par les flux d’entrées, issus de la méthode getInputStream
par les flux de sorties, issus de la méthode getOutputStream.

E. ADAM UPHF Java Avance UPHF/INSA HdF 7 / 34


Protocole TCP Exemple : Client - Serveur TCP

le client-serveur en TCP
package [Link]

Exemple
Un exemple classique de programmation réseau : le
client-serveur.
Un serveur est lancé sur une machine et attend la connexion
d’un client.
Puis, il récupère les lignes envoyées par le client,
il les affiche et les lui renvoie
jusqu’à ce que le client envoie “FIN”

E. ADAM UPHF Java Avance UPHF/INSA HdF 8 / 34


Protocole TCP Exemple : Client - Serveur TCP

Solution : le serveur en TCP I


package [Link]

import j a v a . i o . ∗ ;
import j a v a . net . ∗ ;
c l a s s ServeurTCP {
p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) t h r o w s I O E x c e p t i o n {
// c r e a t i o n d ’ une s o c k e t s e r v e u r
t r y ( S e r v e r S o c k e t s e r v e u r = new S e r v e r S o c k e t ( 8 8 8 8 ) ; ) {
System . o u t . p r i n t l n ( " S o c k e t ␣ l a n c e e ␣ : ␣ " + s e r v e u r ) ;
t r y ( // A t t e n d r e une c o n n e c t i o n
Socket socket = s e r v e u r . accept () ;
// r e c u p e r a t i o n du f l u x d ’ e n t r e e
S c a n n e r i n = new S c a n n e r ( s o c k e t . g e t I n p u t S t r e a m ( ) ) ;
// r e c u p e r a t i o n du f l u x de s o r t i e
P r i n t W r i t e r o u t = new P r i n t W r i t e r ( s o c k e t . g e t O u t p u t S t r e a m
() , true ) ; )
{
System . o u t . p r i n t l n ( " C o n n e c t i o n ␣ a c c e p t e e : ␣ " + s o c k e t ) ;
String str = "" ;

E. ADAM UPHF Java Avance UPHF/INSA HdF 9 / 34


Protocole TCP Exemple : Client - Serveur TCP

Solution : le serveur en TCP II


package [Link]

// a t t e n t e de d o n n e e s
w h i l e ( ! ( s t r . e q u a l s I g n o r e C a s e ( " FIN " ) ) ) {
// a t t e n t e de t e x t e
str = in . nextLine () ;
System . o u t . p r i n t l n ( " s e r v e u r ␣−>␣ m e s s a g e ␣ r e c u ␣ : ␣ " +
str ) ;
// r e t o u r a l ’ e n v o y e u r
o u t . p r i n t l n ( "AR␣ du ␣msg␣ : ␣ " + s t r ) ;
} } } } }

E. ADAM UPHF Java Avance UPHF/INSA HdF 10 / 34


Protocole TCP Exemple : Client - Serveur TCP

Solution : le client en TCP I


package [Link]

import j a v a . i o . ∗ ;
import j a v a . net . ∗ ;

class LeClient {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) t h r o w s I O E x c e p t i o n
{
// r e c u p e r e l ’ a d r e s s e i n t e r n e t du h o s t
// n u l l p e r m e t de t e s t e r l e s a p p l i s s u r une m a c h i n e
unique
I n e t A d d r e s s a d d r = I n e t A d d r e s s . getByName ( n u l l ) ;
try (
S o c k e t s o c k e t = new S o c k e t ( addr , 8 8 8 8 ) ;
// r e c u p e r a t i o n du f l u x d ’ e n t r e e
Scanner i n = new S c a n n e r ( s o c k e t . g e t I n p u t S t r e a m ( ) ) ;
// r e c u p e r a t i o n du f l u x de s o r t i e
P r i n t W r i t e r o u t = new P r i n t W r i t e r ( s o c k e t .
getOutputStream ( ) , true ) ;
S c a n n e r s c a n K e y b o a r d = new S c a n n e r ( System . i n ) ; )
{

E. ADAM UPHF Java Avance UPHF/INSA HdF 11 / 34


Protocole TCP Exemple : Client - Serveur TCP

Solution : le client en TCP II


package [Link]

System . o u t . p r i n t l n ( " c h e z ␣ l e ␣ c l i e n t , ␣ ␣ s o c k e t ␣=␣ " +


socket ) ;

String ligne = "" ;


w h i l e ( ! l i g n e . e q u a l s I g n o r e C a s e ( " FIN " ) ) {
System . o u t . p r i n t l n ( " c l i e n t ␣−>␣ e n t r e z ␣ une ␣ c h a i n e ␣ :
␣" ) ;
// l e c t u r e au c l a v i e r
l i g n e = scanKeyboard . n ex tLi ne () ;
// e n v o i au s e r v e u r
out . p r i n t l n ( l i g n e ) ;
// a t t e n t e du r e t o u r
String str = in . nextLine () ;
System . o u t . p r i n t l n ( " c l i e n t ␣−>␣ r e c u ␣ du ␣ s e r v e u r ␣ : "
+ str ) ;
} } } }

E. ADAM UPHF Java Avance UPHF/INSA HdF 12 / 34


Communication par UDP

Communication par UDP


package [Link]

Présentation
Emission de paquets de données, rapide mais peu fiable
Définir un paquet à envoyer ou à recevoir par la classe
DatagramPacket
Le paquet de données contient l’adresse de destination et la
longueur du paquet
Définir une socket par la classe DatagramSocket

E. ADAM UPHF Java Avance UPHF/INSA HdF 13 / 34


Communication par UDP Exemple : Client - Serveur UDP

Communication par UDP


un serveur attend des données

import j a v a . net . ∗ ;
p u b l i c c l a s s UDPServeur
{
p u b l i c s t a t i c v o i d main ( S t r i n g a r g [ ] )
{
try
{
// S e r v e u r
D a t a g r a m S o c k e t d s = new D a t a g r a m S o c k e t ( 1 2 3 4 ) ;

while ( true )
{
DatagramPacket p a c k e t = new DatagramPacket ( new
byte [ 1 0 2 4 ] , 1024) ;
ds . r e c e i v e ( packet ) ;
System . o u t . p r i n t l n ( " Message : ␣ " + p a c k e t . g e t D a t a
() ) ;
}
}
c a t c h ( E x c e p t i o n e ) {}
}
}
E. ADAM UPHF Java Avance UPHF/INSA HdF 14 / 34
Communication par UDP Exemple : Client - Serveur UDP

Communication par UDP


un client envoit un paquet

import j a v a . net . ∗ ;
p u b l i c c l a s s UDPClient
{
p u b l i c s t a t i c v o i d main ( S t r i n g a r g [ ] )
{
try
{
S t r i n g c h a i n e = " un ␣ m e s s a g e " ;
byte [ ] data = chaine . getBytes ( ) ;
I n e t A d d r e s s a d d r = I n e t A d d r e s s . getByName ( n u l l ) ;
DatagramPacket p a c k e t = new DatagramPacket ( d at a ,
d a t a . l e n g t h , addr , 1 2 3 4 ) ;
D a t a g r a m S o c k e t d s = new D a t a g r a m S o c k e t ( ) ;
ds . send ( packet ) ;
ds . c l o s e ( ) ;
}
c a t c h ( E x c e p t i o n e ) {}
}
}

E. ADAM UPHF Java Avance UPHF/INSA HdF 15 / 34


Liens Internet : URL

Une classe réseau : URL


package [Link]

URL permet de créer des liens vers des pages internets


Exemple :
URL u r l = new URL( " h t t p : / /www . u n i v −v a l e n c i e n n e s . f r / i n d e x .
html " ) ;
D a t a I n p u t S t r e a m d i s = new D a t a I n p u t S t r e a m ( u r l . o p e n S t r e a m ( )
);
String line ;
w h i l e ( ( l i n e = d i s . r e a d L i n e ( ) ) != n u l l )
System . o u t . p r i n t l n ( l i n e ) ;

E. ADAM UPHF Java Avance UPHF/INSA HdF 16 / 34


Liens Internet : URL

Une classe réseau : URL


package [Link]

URLConnection , qui représente le lien http entre le serveur


et le client
Exemple :
try {
URL m o n S i t e = new URL( " h t t p : / / emmanuel . adam . f r e e . f r / s i t e " )
;
URLConnection conn = u r l . o p e n C o n n e c t i o n ( ) ;
S t r i n g t y p e = conn . g e t C o n t e n t T y p e ( ) ;
S t r i n g e n c o d i n g = conn . g e t C o n t e n t E n c o d i n g ( ) ;
i n t l e n = conn . g e t C o n t e n t L e n g t h ( ) ;
Date l a s t M o d i f i e d = new Date ( conn . g e t L a s t M o d i f i e d ( ) ) ;
.....
}
c a t c h ( M a l f o r m e d U R L E x c e p t i o n e ) { . . . ; } // e c h e c new URL ( )
c a t c h ( I O E x c e p t i o n e ) { . . . ; } // e c h e c o p e n C o n n e c t i o n ( )

E. ADAM UPHF Java Avance UPHF/INSA HdF 17 / 34


RMI

R.M.I
package [Link].*

Présentation
R.M.I. = Remote Method Invocation : invoquer des méthodes
d’objets distants ⇒ applications Java distribuées.
applications distribuées ⇒ classes distribuées sur un réseau
R.M.I.  R.P.C. (uniquement transfert de données)
R.M.I. ≺ CORBA (Common Object Request Broker
Architecture) : standard par l’OMG (Object Management
Group), fonctionne sous plusieurs langages ;
I.I.O.P. (Internet InterObject Protocol) permet
l’interopérabilité entre RMI et CORBA.

E. ADAM UPHF Java Avance UPHF/INSA HdF 18 / 34


RMI

R.M.I
package [Link].*

Présentation
Les méthodes des objets distants peuvent être invoquées
depuis des JVM différentes via le réseau.
RMI assure la communication entre le serveur et le client via
TCP/IP,
transparent pour le développeur.
RMI utilise des sockets et RMP (Remote Method Protocol).
Gestion de la sécurité par la classe RMISecurityManager
Gestion de la mémoire distribuée par le DGC (Distibuted
Gabage Collector).

E. ADAM UPHF Java Avance UPHF/INSA HdF 19 / 34


RMI

Architecture
package [Link].*

Principe
Interfaçage : le client doit posséder une vue de ce qu’il peut
appeler → une interface décrivant ce qui est appelable chez
l’objet distant
Le client comme le serveur possède une copie de la même
interface
seul le serveur possède une implémentation de l’interface
Si le client appelle une méthode distante, l’appel est transmis
à son "proxy"
RMI envoit la requête à l’implémentation côté serveur
Les valeurs de retour sont transmise au proxy client puis au
client

E. ADAM UPHF Java Avance UPHF/INSA HdF 20 / 34


RMI Création d’une application distribuée

Interface partagée
package [Link].*

Interface
Il est nécessaire de définir l’interface de l’objet distant et
décrire les méthodes appelables
L’interface doit étendre l’interface Remote et être présente
chez le client et chez le serveur
Les méthodes appelables doivent pouvoir propager l’exception
RemoteException
Les objets retournés doivent être Serializable

i m p o r t j a v a . r m i . Remote ;
import j a v a . rmi . RemoteException ;

p u b l i c i n t e r f a c e T r u c D i s t a n t e x t e n d s Remote
{
S t r i n g donneChaine ( ) throws RemoteException ;
}
E. ADAM UPHF Java Avance UPHF/INSA HdF 21 / 34
RMI Création d’une application distribuée

Implémentation de l’objet distant


Côté serveur : Implémentation de l’objet distant

Objet Distant
Le nom de l’objet implémenant a pour suffixe Impl
(convention)
La classe doit étendre la classe RemoteObject, ou une sous
classe (UnicastRemoteObject)
Le constructeur doit propager une exception RemoteException

p u b l i c c l a s s TrucDistantImpl extends UnicastRemoteObject


implements T r u c D i s t a n t {

String chaine ;

protected TrucDistantImpl ( ) throws RemoteException {


c h a i n e = " c o u c o u ␣ du ␣ s e r v e u r ␣ ! ␣ " ; }

p u b l i c S t r i n g donneChaine ( ) throws RemoteException


{ return chaine ; }

E. ADAM UPHF Java Avance UPHF/INSA HdF 22 / 34


RMI Création d’une application distribuée

Enregistrement / Recherche : Naming

Enregistrement / Recherche : Naming


La classe Naming :
enregistrer un objet serveur
diffuser des références à des objets d’un registre distant
(comme rmiregistry, JNDI, ...).
avec adresse = "rmi ://host :port/nom" ou "//host/nom" ou
. . . et nom = nom de l’objet dans l’annuaire
bind(adresse, objet) : enregistre objet dans l’annuaire sous le
nom de l’adresse
rebind(adresse, objet) : enregistre un nouvel objet dans
l’annuaire sous nom déjà donné
unbind(adresse, objet) : desinscrit l’objet de l’annuaire sous
l’adresse donnée
list() : retourne tous les enregistrements d’objets
lookup(adresse) : retourne une référence à l’objet distant
spécifié dans adresse

E. ADAM UPHF Java Avance UPHF/INSA HdF 23 / 34


RMI Exemple d’application

Côté serveur : Exemple d’Enregistrement

Démarrer l’annuaire : lancer rmiregistry

// Le s e r v e u r :
public c lass LeServeur {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s )
{
try {
// C r e a t i o n d ’ un o b j e t a r e n d r e a c c e s s i b l e :
T r u c D i s t a n t I m p l t r u c = new T r u c D i s t a n t I m p l ( ) ;
// p u b l i c a t i o n de l ’ o b j e t d a n s l ’ a n n u a i r e
j a v a . r m i . Naming . b i n d ( " r m i : / / l o c a l h o s t / UnTruc " , t r u c ) ;
System . o u t . p r i n t l n ( " S e r v e u r ␣ l a n c e . " ) ;
}
catch ( Exception e ) {
System . o u t . p r i n t l n ( " E x c e p t i o n ␣ l e v e e ␣ : ␣ " + e . g e t M e s s a g e ( ) ) ;
} } }

E. ADAM UPHF Java Avance UPHF/INSA HdF 24 / 34


RMI Exemple d’application

Côté client : Exemple de recherche et


d’utilisation

// Le c l i e n t :
public class LeClient {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
try {
// r e c u p e r e r un o b j e t de t y p e T r u c D i s t a n t ( i n t e r f a c e )
T r u c D i s t a n t t r u c = ( T r u c D i s t a n t ) j a v a . r m i . Naming . l o o k u p ( "
r m i : / / l o c a l h o s t / UnTruc " ) ;
System . o u t . p r i n t l n ( " c h a i n e ␣ r e c u p e r e e ␣ : ␣ " + t r u c .
donneChaine ( ) ) ;
}
c a t c h ( E x c e p t i o n e ) { System . o u t . p r i n t l n ( e ) ; }
} }

E. ADAM UPHF Java Avance UPHF/INSA HdF 25 / 34


RMI Recherche de classes accessoires

Recherche de classes

Recherche de classes accessoires


Un appel à une méthode d’un objet distant peut nécessiter
des classes non présentes chez le client
il faut les téléchager !
La classe RMIClassLoader est appelée automatiquement pour
télécharger les classes manquantes
Ces classes doivent être Serializable
Il faut indiquer à Java où télécharger les classes manquantes
dans le lancement du Serveur
Utilisation du paramètre [Link] :
java
-[Link]=http: //[Link]/lesClasses/
LeServeur
L’adresse peut être de type ftp ; possibilité d’indiquer un no de
port

E. ADAM UPHF Java Avance UPHF/INSA HdF 26 / 34


RMI Sécurité

Stratégie de sécurité

Sécurité
Le chargement dynamique de classe peut être refusé pour des
raisons de sécurité.
Naming retourne une erreur de type AccessControlException
Utilisation d’un gestionnaire de sécurité :
RMISecurityManager.
[Link](new
RMISecurityManager());
Définition des permissions dans un fichier .policy lu
automatiquement
exemple de contenu :
grant {
permission [Link];
}
Signaler à java d’utiliser le fichier :
java -[Link]=chemin / [Link]
LeServeur
E. ADAM UPHF Java Avance UPHF/INSA HdF 27 / 34
RMI Remarques

Remarques

Création d’objets distant


Le client ne peut créer un nouvel objet distant
Le serveur peut créer un nouvel objet distant et retourner un
objet de ce type
Il suffit de créer une méthode retournant une nouvelle instance
du type distant dans le type distant

Ramasse miette distribué


Les objets distants non référencés sont supprimés du serveur
Pour suivre un nettoyage d’un objet,il doit implémenter
l’interface [Link]
et coder la méthode public void unreferenced();

E. ADAM UPHF Java Avance UPHF/INSA HdF 28 / 34


Communication 1-n (1 serveur - N clients)

L’architecture client-serveur 1-N


package [Link]

utilisation de canaux
Pour la communication 1-N par socket, il faut :
Utilisation d’un sélecteur en écoute sur un port
Chaque demande de connection crée une clé de connection
Pour chaque clé de connection : créer une clé de lecture

Exemple
1 serveur accepte la connection de N clients et
suite à une lecture d’une chaine d’un client :
il balaie les clés et envoyer la chaine aux autres clients

E. ADAM UPHF Java Avance UPHF/INSA HdF 29 / 34


Communication 1-n (1 serveur - N clients)

Exemple de serveur 1-N I


package [Link]

import java . io . IOException ;


import java . net . InetSocketAddress ;
import java . nio . ByteBuffer ;
import java . nio . channels . ∗ ;
import java . util .∗;

/∗ ∗ d ’ a p r e s F r e d e r i c Chuong ∗/

p u b l i c c l a s s ServeurNIO {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
i n t port = 1080;
try {
// o u v r i r un s e l e c t e u r
S e l e c t o r s e l e c t o r = S e l e c t o r . open ( ) ;
// o u v r i r un s e r v e u r non b l o q u a n t s u r l e p o r t
S e r v e r S o c k e t C h a n n e l s e r v e r = S e r v e r S o c k e t C h a n n e l . open ( ) ;
server . configureBlocking ( false ) ;
s e r v e r . s o c k e t ( ) . b i n d ( new I n e t S o c k e t A d d r e s s ( p o r t ) ) ;
s e r v e r . r e g i s t e r ( s e l e c t o r , S e l e c t i o n K e y . OP_ACCEPT) ;

E. ADAM UPHF Java Avance UPHF/INSA HdF 30 / 34


Communication 1-n (1 serveur - N clients)

Exemple de serveur 1-N II


package [Link]

// d e f i n i r un tampon de 1024 b y t e s
ByteBuffer b u f f e r = ByteBuffer . a l l o c a t e (1024) ;
// t q i l y a d e s e l e m e n t s d a n s l e s e l e c t e u r
wh ile ( s e l e c t o r . s e l e c t ( ) > 0) {
// b a l a y e r l e s c l e s du s e l e c t e u r
Set<S e l e c t i o n K e y > s e l e c t e d K e y s = s e l e c t o r . s e l e c t e d K e y s ( )
;
I t e r a t o r <S e l e c t i o n K e y > i = s e l e c t e d K e y s . i t e r a t o r ( ) ;
while ( i . hasNext ( ) ) {
S e l e c t i o n K e y key = i . next ( ) ;
i . remove ( ) ;
// s i l a c l e ( c a n a l ) p e u t e t r e a c c e p t e e
i f ( key . i s A c c e p t a b l e ( ) ) {
// l ’ a c c e p t e r e t r e d e f i n i r l ’ o p t i o n du c a n a l d a n s l e
s e l e c t e u r ( pour l i r e l e s donnees )
SocketChannel socket = s e r v e r . accept () ;
socket . configureBlocking ( false ) ;
s o c k e t . r e g i s t e r ( s e l e c t o r , S e l e c t i o n K e y . OP_READ) ;
}

E. ADAM UPHF Java Avance UPHF/INSA HdF 31 / 34


Communication 1-n (1 serveur - N clients)

Exemple de serveur 1-N III


package [Link]

// s i l a c l e ( c a n a l ) p e u t e t r e l u e
e l s e i f ( key . i s R e a d a b l e ( ) ) {
// r e c u p e r e r l e c a n a l
SocketChannel channel = ( SocketChannel ) key . channel ( ) ;
int len ;
try {
// l i r e d a n s l e c a n a l
len = channel . read ( b u f f e r ) ;
// s ’ i l n ’ y a p l u s d ’ e l e m e n t s , f e r m e r l e c a n a l e t l e
d e s i n s c r i r e du s e l e c t e u r
i f ( l e n <= 0 ) {
channel . keyFor ( s e l e c t o r ) . ca n ce l () ;
channel . close () ;
} else {
// s i n o n , a f f i c h e r l e b u f f e r
buffer . f l i p () ;
System . o u t . w r i t e ( b u f f e r . a r r a y ( ) , 0 , l e n ) ;

E. ADAM UPHF Java Avance UPHF/INSA HdF 32 / 34


Communication 1-n (1 serveur - N clients)

Exemple de serveur 1-N IV


package [Link]

// e t l e t r a n s m e t t r e a t o u s l e s c l i e n t s
Set<S e l e c t i o n K e y > k e y s = s e l e c t o r . k e y s ( ) ;
I t e r a t o r <S e l e c t i o n K e y > i 2 = k e y s . i t e r a t o r ( ) ;
while ( i 2 . hasNext ( ) ) {
S e l e c t i o n K e y key2 = i 2 . next ( ) ;
// v e r i f i e r que l a c l e v i e n t d ’ un c l i e n t
i f ( key2 . channel ( ) i n s t a n c e o f SocketChannel ) {
SocketChannel otherChannel = ( SocketChannel ) key2 .
channel () ;
i f (! channel . equals ( otherChannel ) ) {
// r e m b o b i n e r l e b u f f e r
b u f f e r . rewind () ;
// l e t r a n s m e t t r e au c l i e n t
otherChannel . write ( buffer ) ;
} } }
buffer . clear () ;
}
} catch ( IOException e ) {
e . printStackTrace () ;
try {

E. ADAM UPHF Java Avance UPHF/INSA HdF 33 / 34


Communication 1-n (1 serveur - N clients)

Exemple de serveur 1-N V


package [Link]

channel . keyFor ( s e l e c t o r ) . ca n ce l () ;
} c a t c h ( E x c e p t i o n e2 ) {
} } } } }
} catch ( IOException e ) {
e . printStackTrace () ;
} }
}

E. ADAM UPHF Java Avance UPHF/INSA HdF 34 / 34

Vous aimerez peut-être aussi