11
Serveurs réseau
En pratique, il y a bien plus de chances que vous écriviez
du code de client réseau que du code de serveur réseau.
Toutefois, bon nombre d’applications intègrent à la fois des
fonctionnalités client et des fonctionnalités serveur. Java
propose un excellent support pour les deux.
Le paquetage
java.net
fournit les fonctionnalités de com-
munication réseau côté serveur que nous utiliserons dans
ce chapitre. La plate-forme J2EE (que nous n’abordons pas
dans ce livre) propose de nombreux services réseau sup-
plémentaires dont un support complet du développement
web Java côté serveur. Parmi les technologies réseau
incluses dans la plate-forme J2EE, on peut citer les servlets,
les EJB et le JMS.
MEP_GdS_Java.indd 131 06/10/11 13:05
© 2011 Pearson Education France – Java, mise à jour pour Java 7 – Timothy Fisher
132 CHAPITRE 11 Serveurs réseau
Retourner une réponse
Créer un serveur et accepter
une requête
public static final short PORT = 9988;
ServerSocket server = new ServerSocket(PORT);
while ((clientSock = server.accept( )) != null) {
// Traiter la demande du client
}
Cet exemple utilise une instance de
ServerSocket
pour
créer un serveur écoutant sur le port 9988. Nous passons
le port sur lequel nous souhaitons que le serveur écoute
au constructeur du
ServerSocket
. Une fois le socket ser-
veur créé, nous appelons la méthode
accept()
pour
attendre une connexion client.
La méthode
accept()
bloque l’exécution jusqu’à ce
qu’une connexion avec un client soit opérée. Lorsqu’une
connexion est établie, une nouvelle instance
Socket
est
retournée.
Si un gestionnaire de sécurité est utilisé, sa méthode
check-
Accept()
est appelée avec
clientSock.getInetAddress().
getHostAddress()
et
clientSock.getPort()
en arguments,
afin de s’assurer que l’opération est autorisée. Cette vérifi-
cation peut lever une exception
SecurityException
.
Les exemples de ce chapitre utilisent tous la classe
ServerSocket
. Elle est utilisée par le serveur pour attendre
et établir les connexions client.
L’exemple précédent l’a montré : lorsque vous commen-
cez par créer un objet de la classe
ServerSocket
, vous devez
spécifier un port à écouter pour les requêtes entrantes. La
classe
ServerSocket
elle-même n’est pas utilisée pour la
MEP_GdS_Java.indd 132 06/10/11 13:05
© 2011 Pearson Education France – Java, mise à jour pour Java 7 – Timothy Fisher
133
Retourner une réponse
communication avec le client, mais uniquement pour
établir une connexion avec lui. Lorsque
ServerSocket
accepte une connexion client, une instance
Socket
stan-
dard est retournée. C’est cette instance qui est utilisée
pour communiquer avec le client.
Pour plus d’informations sur la manière d’écrire votre
code lorsque vous vous attendrez à devoir gérer de nom-
breuses requêtes clientes simultanées, consultez l’exemple
“Gérer plusieurs clients” de ce chapitre.
Retourner une réponse
Socket clientSock = serverSocket.accept();
DataOutputStream out = new
DataOutputStream(clientSock.getOutputStream());
out.writeInt(someValue);
out.close();
Cet exemple montre comment retourner une réponse du
serveur au client. La méthode
accept()
de l’instance
ServerSocket
retourne une instance
Socket
lorsqu’une
connexion est établie avec un client. Nous obtenons
ensuite le flux de sortie de ce socket en appelant la
méthode
getOutputStream()
de cet objet. Nous utilisons
le flux de sortie pour instancier un
DataOutputStream
et
appelons la méthode
writeInt()
de ce dernier pour écrire
une valeur entière envoyée sous forme de données
binaires au client. Pour finir, nous fermons le socket en
utilisant la méthode
close()
du
Socket
.
Cet exemple utilise la méthode
write()
, mais
DataOut -
putStream
possède bien d’autres méthodes pour écrire
des données depuis n’importe quel type de données Java
MEP_GdS_Java.indd 133 06/10/11 13:05
© 2011 Pearson Education France – Java, mise à jour pour Java 7 – Timothy Fisher
134 CHAPITRE 11 Serveurs réseau
Retourner un objet
primitif, et notamment les suivantes :
write()
,
writeBoo-
lean()
,
writeByte()
,
writeBytes()
,
writeChar()
,
writeChars()
,
writeDouble()
,
writeFloat()
,
writeInt()
,
writeLong()
et
writeShort()
. Pour plus d’informations sur l’utilisation
de ces méthodes et des autres méthodes de la classe
DataOutputStream
, consultez la JavaDoc à l’adresse
http://
download.oracle.com/javase/7/docs/api/java/io/
DataOutputStream.html
.
Si vous souhaitez écrire des données texte au client, utili-
sez le code suivant :
Socket clientSock = serverSocket.accept();
PrintWriter out = new PrintWriter(new
OutputStreamWriter(clientSock.getOutputStream()), true);
out.println(“Hello World”);
out.close();
Au lieu de créer un
DataOutputStream
, nous créons cette
fois un
OutputStreamWriter
et un
PrintWriter
. La méthode
print()
du
PrintWriter
permet d’écrire une chaîne de
texte à destination du client. Le second paramètre passé
au constructeur
PrintWriter
définit l’option de purge
automatique. La valeur
true
amène les méthodes
println()
,
printf()
et
format()
à vider automatiquement
le tampon de sortie. Comme notre exemple utilise la
méthode
println()
, il n’est pas nécessaire d’appeler expli-
citement la méthode
flush()
. Enfin comme toujours,
lorsque nous avons fini d’utiliser le
PrintWriter
, nous
appelons la méthode
close()
pour fermer le flux.
Retourner un objet
Socket clientSock = serverSocket.accept();
ObjectOutputStream os = new ObjectOutputStream(
MEP_GdS_Java.indd 134 06/10/11 13:05
© 2011 Pearson Education France – Java, mise à jour pour Java 7 – Timothy Fisher
135
Retourner un objet
clientSock.getOutputStream( ));
// Retourner un objet
os.writeObject(new Date());
os.close();
Cet exemple retourne un objet sérialisé au client. Nous
obtenons une instance
Socket
que retourne la méthode
accept()
du
ServerSocket
une fois qu’une connexion à
un client est établie. Nous créons alors une instance
ObjectOutputStream
et nous passons le flux de sortie
obtenu depuis le socket client.
ObjectOutputStream
est
utilisée pour écrire des types de données primitifs et des
graphes d’objets Java vers un
OutputStream
. Dans cet
exemple, nous écrivons un objet
Date
dans le flux de
sortie puis nous fermons ce flux.
La méthode
writeObject()
sérialise l’objet passé en para-
mètre. Dans cet exemple, il s’agit d’un objet
Date
. Tous les
champs de données qui ne sont pas transitoires et dyna-
miques sont préservés dans la sérialisation et restaurés
lorsque l’objet est désérialisé. Seuls les objets qui sup-
portent l’interface
java.io.Serializable
peuvent être
sérialisés.
La librairie XStream de
codehaus.org
propose une
alternative intéressante aux classes
ObjectOutputStream
et
ObjectInputStream
. XStream fournit des implémentations
de
ObjectInputStream
et de
ObjectOutputStream
qui per-
mettent aux flux d’objets d’être sérialisés ou désérialisés
en XML. La classe
ObjectInputStream
standard utilise un
format binaire pour les données sérialisées. La sortie
sérialisée des classes XStream fournit pour sa part les
classes sérialisées dans un format XML facile à lire. Pour
plus d’informations sur XStream et pour télécharger ce
projet, rendez-vous à l’adresse
http://xstream.code-
haus.org/
.
MEP_GdS_Java.indd 135 06/10/11 13:05
© 2011 Pearson Education France – Java, mise à jour pour Java 7 – Timothy Fisher
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !