Une fois que la socket est ouverte, les méthodes getOutputStream() et getInputStream() de java.net.Socket peuvent être
sollicitées pour renvoyer respectivement les objets OutputStream et InputStream que vous pouvez utiliser par la suite
comme n'importe quel autre flux.
Evidemment, la classe Socket est très simple d'emploi, car Java masque toute la complexité inhérente à
l'établissement d'une connexion réseau et à l'envoi de données. Le paquetage java.net vous fournit quand à lui
une interface de programmation tout-à-fait semblable à celle que vous obtiendriez avec un simple fichier.
2. Respecter le protocole établi par le serveur. Il faut savoir par exemple qui parle en premier et surtout, il faut prendre en compte
le type de l'information envoyé, ce qui se traduit généralement à choisir un flux d'information adapté.
Dans le cas qui nous préoccupe, seul le serveur dialogue, sans information de retour. La réponse envoyée est un
simple texte qui peut toutefois être interprété très simplement en prenant le flux de lecture de texte représenté par la
classe Scanner.
3. Finalement, pour obtenir la réponse souhaitée, il suffit de se connecter au flot d'octets envoyé par le serveur au moyen de la
méthode getInputStream() de la socket et de le rattacher au flux de plus haut niveau afin de formater correctement l'information :
Scanner réponse =new Scanner(connexion.getInputStream());
4. Tout le reste ensuite est connu. Nous pouvons procéder exactement de la même façon que lors d'une lecture de fichier, sauf
qu'ici l'information n'est pas sur le disque dur mais transite sur le réseau. Finalement les deux lignes les plus importantes sont
celles que nous venons d'évoquer. Grâce à ces deux petites lignes, nous pouvons faire une gestion extrêmement simple des
informations issues du réseau :
Socket connexion =new Socket("time.nist.gov",13);
Scanner réponse =new Scanner(connexion.getInputStream());
Pour en savoir plus sur les flux et les fichiers
§
Le timeout des sockets
Le principe de base d'un dialogue sur le réseau, c'est de lire le flux d'octets provenant du service jusqu'à ce que l'ensemble de l'information soit
récupérée. Dans ce cas de figure, il est tout-à-fait possible que le temps de transfert soit très long, qu'il soit même beaucoup trop important, suite à
un problème éventuel de connexion réseau.
Il est envisageable de contrôler le temps de transfert maximum toléré pour une application au delà duquel nous considérons qu'un problème
de communication réseau doit certainement se produire. Ce temps maximum est appelé timeout. La classe Socket possède la méthode
setSoTimeout() qui précise la valeur de la durée d'attente maximum en milliseconde à ne pas dépasser.
Socket connexion =new Socket("time.nist.gov",13);
connexion.setSoTimeout(10000); // 10 secondes d'attente maximum
Si le timeout est atteint avant la fin de lecture complète de l'information attendue, une InterruptedIOException est levée. Vous
pouvez ainsi intercepter cette exception et réagir au timeout.
Dans l'écriture précédente il existe toutefois un petit soucis. Effectivement, durant la phase de construction de la connexion, le timeout n'est
pas encore précisé. Le temps d'attente peut alors être infini si un problème réseau apparaît. Nous pouvons palier à ce problème en
proposant la création d'une socket non-connectée, puis en la connectant plus tard avec le timeout requis, comme suit :