Les sockets UDP/TCP
Les sockets TCP Communication en mode connecté
Avec des sockets de flux (sockets TCP), un processus établit une connexion avec un
autre processus. Pendant qu’une connexion est en place, les données affluent entre
les processus dans un flux contenu. On dit alors que les sockets de flux assurent un
service par connexion. Le protocole qui sert à la transmission est le très célèbre TCP
(Transmission Control Protocol).
Deux classes interviennent:
[Link] (côté client et côté serveur).
[Link] (côté serveur).
Les sockets UDP/TCP
Classe Socket Constructeurs
protected Socket() Crée une socket non connecté.
public Socket(InetAddress address, int port) Crée une socket de flux, et la connecte au
numéro « port » et à l’adresse indiquée.
Socket(InetAddress host, int port, boolean stream) Utiliser à la place DatagramSocket.
Socket (InetAddress address, int port, InetAddress localAddr, int localPort) Crée une socket et la connecte à l’adresse
distante et sur le port distant indiqués.
Protected Socket (SocketImpl) Crée une socket non connecté en utilisant la
classe abstraite SocketImpl.
public Socket (String host, int port) Crée une socket de flux, et la connecte sur le
numéro de port indiqué de l’hôte nommé.
Socket (String host, int port, boolean stream) Utiliser à la place DatagramSocket.
Socket (String host, int port, InetAddress localAddr, int localPort) Crée une socket et la connecte sur le port
de l’hôte distant indiqués.
Les sockets UDP/TCP
Classe Socket Méthodes
void close() throws IOException;
void shutDownInput() throws IOException: Fermeture de la socket pour la lecture.
void shutDownOutput() throws IOException: Fermeture de la socket pour l’écriture.
InetAddress getLocalAddress(): Rend l’adresse de la machine hôte.
InetAddress getInetAddress(): Retourne l’adresse de la machine à laquelle on est
connecté.
int getLocalPort();
int getPort();
Remarque: Les constructeurs et la plupart des méthodes peuvent générer une IOException.
Les sockets UDP/TCP
Socket client Etablir la connexion
Pour établir une connexion TCP, un client doit construire sa socket locale, instance
de la classe Socket, l’attacher, si le constructeur ne l’a pas déjà fait, à une adresse
Internet et un port TCP locaux, puis demander sa connexion à la socket d’un
serveur.
Pour attacher la socket à une adresse Internet et un port TCP locaux, il faut appeler
la méthode bind() qui prend en argument une adresse de socket de la classe
SocketAddress. Si cet argument est null, la socket est attachée à une adresse
valide et un port TCP libre. Sinon, l’argument doit être de la classe
InetSocketAddress. Si l’adresse Internet encapsulée dans cette adresse de socket
est nulle, la socket est attachée à un port TCP libre et sinon, la socket est attachée
à l’adresse Internet et au port TCP encapsulés.
Les raisons d’un échec d’attachement d’une socket à l’adresse demandée sont :
Le port est réservé ou déjà utilisé : une exception de la classe BindException est
levée.
La socket est déjà attachée : une exception de la classe SocketException est
levée. La méthode isBound() permet de savoir si la socket est déjà attachée.
Les sockets UDP/TCP
Socket client Etablir la connexion
Pour tenter de connecter la socket, il faut appeler la méthode connect() de la
socket locale en lui passant en argument l’adresse de la socket du serveur à
laquelle se connecter. Si la socket locale n’est pas encore attachée, elle est
automatiquement attachée à une adresse valide et un port TCP libre.
La méthode connect() est surchargée afin d’accepter en second argument un
délai maximum d’attente pour la connexion TCP. Si le délai expire avant
l’établissement de la connexion, la méthode connect() lève une exception de la
classe SocketTimeoutException.
Remarque : Si un gestionnaire de sécurité est mis en place, l’attachement et la connexion de la socket
sont subordonnés à la détention d’un droit particulier.
Les sockets UDP/TCP
ServerSocket Constructeurs
Socket d'attente de connexion, côté serveur uniquement.
Constructeurs: La classe ServerSocket possède plusieurs constructeurs comme:
public ServerSocket(): Constructeur par défaut.
public ServerSocket(int port): Crée une socket d'écoute (d'attente de
connexion de la part de clients). La socket est liée au port dont le numéro est
passé en paramètre. L'exception est levée notamment si ce port est déjà lié à
une autre socket.
public ServerSocket (port, longueurFileAttente);
- port: spécifie le numéro de port sur lequel le serveur attend les connexions des
clients.
- longueurFileAttente: spécifie un nombre maximal de clients qui peuvent
demander une connexion au serveur. Si la file d’attente est pleine, les
connexions des clients sont automatiquement refusées.
Les sockets UDP/TCP
ServerSocket Méthodes
Méthodes
Socket accept() throws IOException: Attente de connexion d'un client distant.
Quand une connexion est faite, cette méthode retourne une socket permettant
de communiquer avec le client (objet Socket). Cette méthode est dite
bloquante ce qui implique un type de programmation particulier (boucle infinie
qui se termine seulement si une erreur grave se produit).
void setSoTimeout(int timeout) throws SocketException: Positionne le temps
maximum d'attente de connexion sur un accept(). Si temps écoulé, la méthode
accept() lève l'exception SocketTimeoutException.
Etc.
Remarque: Par défaut, attente infinie sur l'accept.
Les sockets UDP/TCP
Les sockets TCP Programme client-serveur en mode connecté
Côté serveur: La mise en place d’un serveur élémentaire en Java requiert cinq
étapes.
1. La première étape consiste à créer un objet ServerSocket.
Exemple: ServerSocket sersoc = new ServerSocket (port);
2. Une fois le ServerSocket établi (à la deuxième étape), le serveur écoute
indéfiniment, ou se verrouille sur, les tentatives de connexion des clients. Ceci est
assuré par un appel à la méthode accept() de ServerSocket. Ce qui renvoie un
objet Socket lorsqu’une connexion est établie.
Exemple: Socket soc = [Link]();
3. La classe Socket définit un canal de transmission entre machines. Après avoir
créé deux objets de type Socket, un sur chacun des sites communicants, et
après les avoir connectés, les communications se font au moyen de canaux
d’entrées/sorties séquentielles de type InputStream et OutputStream. La
troisième étape consiste donc à obtenir les objets OutputStream et InputStream.
les flots d’entrée et de sortie de la connexion TCP vers la socket du serveur
sont récupérables par les méthodes getInputStream() et getOutputStream()
de l’objet socket. Ces deux méthodes retournent des flots d’octects.
Les sockets UDP/TCP
Les sockets TCP Programme client-serveur en mode connecté
4. La quatrième étape constitue la phase de traitement pendant laquelle le
serveur et le client communiquent via les objets OutputStream et InputStream.
5. A la cinquième étape, quand la transmission s’achève, le serveur clôture la
connexion en invoquant la méthode close() sur la socket.
On retourne à l‘étape 2 pour récupérer le client suivant.
Les sockets UDP/TCP
Les sockets TCP Programme client-serveur en mode connecté
Côté client: Un client TCP est lié à l’ouverture d’une connexion TCP avec un serveur.
C’est toujours le client qui établit une connexion. En général, la période qui s’écoule
entre l’établissement de cette connexion et sa fin est appelée une session TCP.
Pour pouvoir communiquer avec le serveur, le client créera un objet de type
Socket.
Remarque: Le serveur doit être démarré avant le client. Dans le cas contraire, si le client se connecte à
un serveur inexistant, une exception sera levée après un time-out.
Les sockets UDP/TCP
Les sockets TCP Programmation d’un serveur à plusieurs clients simultanés
Le serveur possède deux parties bien distinctes:
Un thread principal qui utilise l’objet ServerSocket et y attend des connexions.
Un thread auxiliaire pour chaque connexion: Sur réception d’une connexion, le
serveur (thread) principal crée un autre thread auxiliaire qui gère uniquement
cette connexion.
Le client est un programme principal qui utilise l’objet Socket s’en sert pour se
connecter au serveur.
Les sockets UDP/TCP
Les sockets Gestion des exceptions