Programmation Réseau en Java
Support Numéro 2
Sockets serveurs
La classe ServerSocket
Cette classe permet de créer des sockets qui attendent des connections sur un port spécifié et lors d’une connexion retournent un Socket qui permet de communiquer avec l’appelant.
1. Constructeurs
public ServerSocket (int port) throws IOException
Ce constructeur crée un socket serveur qui attendra les connexions sur le port spécifié. Lorsque l’entier port vaut 0, le port est sélectionné par le système. Ces ports anonymes sont peu utilisés car le client doit connaître à l’avance le numéro du port de destination. Il faut donc un mécanisme, comme le portmapper des RPC, qui permet d’obtenir ce numéro de port à partir d’une autre information.
L’echec de la création se solde par une IOException (ou à partir de Java 1.1 une BindException qui hérite de IOException) qui traduit soit l’indisponibilité du port choisi soit, sous UNIX, un problème de droits (sous UNIX les ports inférieurs à 1024 ne sont disponibles que pour le super utilisateur).
public ServerSocket (int port, int tailleFile) throws IOException
Ce constructeur permet en outre de préciser la longueur de la file d’attente des requêtes de connexion. Si une demande de connexion arrive et que la file est pleine la connexion sera refusée sinon elle sera stockée dans la file pour être traitée ultérieurement. La longueur de la file d’attente par défaut (pour le premier constructeur) est 50.
Lorsque la valeur donnée est supérieure à la limite fixée par le système, la taille maximale est affectée à la file.
public ServerSocket (int port, int tailleFile, InetAddress adresseLocale) throws IOException
Ce constructeur permet en outre de préciser l’adresse Internet locale sur laquelle attendre des connexions. Ainsi on pourra choisir l’une des interfaces réseau de la machine locale si elle en possède plusieurs. Si adresseLocale est à null le socket attendra des connexions sur toutes les adresses locales (ce qui est aussi le cas quand on utilise l’un des deux autres constructeurs).
2. Accepter et clore une connexion
public Socket accept () throws IOException
Cette méthode bloque l’exécution du programme serveur dans l’attente d’une demande de connexion d’un client. Elle renvoie un objet Socket une fois la connexion établie.
Si vous ne voulez pas bloquer l’exécution du programme il suffit de placer l’appel à accept dans un thread spécifique.
public void close () throws IOException
Cette méthode ferme le socket serveur en libérant le port. Les sockets serveurs sont eux aussi fermés automatiquement par le système à la fermeture de l’application mais il est fortement conseillé de les fermer explicitement.
3. Méthodes informatives
public InetAddress getInetAddress ()
public int getLocalPort ()
Ces méthodes renvoient l'adresse Internet et le port locaux sur lequel le socket attends les connexions.
4. Options des sockets serveurs
Seule l’option SO_TIMEOUT est disponible pour les sockets serveurs.
public int getSoTimeout() throws SocketException
public void setSoTimeout(int ms) throws SocketException
Par défaut, l’appel à accept() se bloque jusqu’à la réception d’une demande de connexion. Lorsque SO_TIMEOUT est initialisée, cette attente ne dépasse pas le temps imparti, exprimé en millisecondes. Tout dépassement de temps se solde par une InterruptedException. Le socket reste malgré tout connecté.
La valeur par défaut est 0 qui signifie, ici, un laps de temps infini ce qui convient à la plupart des serveurs, conçus en général pour s’exécuter indéfiniment.
L’option doit être validée avant l’appel à accept() pour être prise en compte.
Le paramètre doit être >= 0 sans quoi une exception SocketException est générée.
5. Méthode surchargée
public String toString()
La seule méthode surchargée de la classe Object est toString(). Cette méthode provoque l’affichage d’une chaîne ressemblant à cela :
ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=80]
Sous Java 1.1 et les précédentes versions addr et port sont toujours nulles. La seule information utile est donc localport qui indique le numéro du port d’attente des connexions. Cette méthode est ici aussi plutôt destinée au débogage.