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