Niveau : | Elémentaire |
Une WebSocket est une spécification d'un protocole permettant une communication bidirectionnelle et full duplex sur une seule socket TCP entre un client et un serveur.
Initialement développé pour HTML 5, WebSocket a été normalisé par l'IETF et le W3C. Tous les navigateurs récents implémentent et supportent les WebSockets. Ce protocole permet notamment d'implémenter facilement et de manière standard l'envoi de données en mode Push à l'initiative du serveur.
Ce chapitre contient plusieurs sections :
HTTP est un protocole sans état qui fonctionne sur le modèle requête/réponse. Avant la version 1.1 d'HTTP, chaque requête faite au serveur utilise une nouvelle connexion. A partir d'HTTP 1.1, il est possible d'utiliser des connexions persistantes qui permettent au client d'utiliser la même connexion pour obtenir les autres éléments de la page.
HTTP est le protocole standard utilisé pour le Web : il a été conçu pour obtenir des éléments du web. Il répond à de nombreux besoins mais il possède plusieurs inconvénients notamment pour une utilisation dans une application web interactive :
Plusieurs techniques ont été développées pour contourner cette limitation :
Comet est un concept dont le but est de permettre à un serveur d'envoyer à son initiative des données à un navigateur. Plusieurs techniques sont utilisées pour répondre au concept Comet (streaming, hidden iframe, Ajax avec long polling, ...).
Cependant, il était nécessaire de définir un standard qui permette la communication entre les clients et le serveur de manière bi-directionnelle utilisant un canal en mode full duplex. Le mode full-duplex indique qu'une WebSocket permet d'envoyer des messages du côté client et serveur indépendamment l'un de l'autre.
En 2011, l'IETF a défini le protocole WebSocket sous la RFC 6455. Depuis, les principaux navigateurs implémentent le protocole WebSocket et plusieurs implémentations sont disponibles pour la plate-forme Java.
Une WebSocket permet l'échange de données entre un client et un serveur de manière asynchrone, bidirectionnelle en mode full duplex utilisant une connections TCP.
Les WebSockets sont typiquement utilisées pour envoyer de petits messages.
La spécification du protocole WebSocket est définie dans la RFC 6455, publiée en décembre 2011.
L'utilisation d'une WebSocket dans une page web peut se faire avec l'API JavaScript dédiée proposée par HTML 5 : ceci facilite son adoption dans les applications web.
La demande d'interactivité des pages HTML se trouve limitée par le protocole HTTP :
Les WebSockets sont plus efficaces et sont plus performantes que les autres solutions :
Une WebSocket est un protocole réseau reposant sur TCP. Le protocole est composé de deux phases :
Les données de type texte reçues d'une websocket sont encodées en UTF-8.
La mise en oeuvre des WebSockets requière plusieurs étapes :
Les cas d'utilisation des WebSockets sont nombreux : elles sont utilisables dès que des données doivent être envoyées du serveur vers le ou les clients.
Une connexion WebSocket est initialisée en utilisant le protocole HTTP : chaque connexion à une WebSocket débute par une requête HTTP qui utilise l'option upgrade dans son en-tête. Cette option permet de préciser que le client souhaite que la connexion utilise un autre protocole, en l'occurrence le protocole WebSocket. Cette requête HTTP s'appelle handshake dans le cas de l'utilisation d'une WebSocket.
Lorsque le serveur répond, la connexion est établie et le client et le serveur peuvent envoyer et recevoir des messages.
Le protocole HTTP n'est utilisé que pour établir la connexion d'une WebSocket : une fois la connexion établie le protocole HTTP n'est plus utilisé au profit du protocole WebSocket.
C'est toujours le client qui initie une demande de connexion : le serveur ne peut pas initier de connexions mais il est à l'écoute des clients qui le contacte pour créer une connexion.
Une WebSocket est identifiée par une URI particulière définie dans la RFC dont la syntaxe générale est :
ws(s)://host[:port]path[?param]
L'étape de connexion (Opening Handshake) requiert un unique échange HTTP (requête/réponse) entre le client qui initie la connexion et le serveur. La requête HTTP utilise l'option Upgrade qui permet de demander le changement du protocole utilisé pour les échanges.
La version 1.1 du protocole HTTP doit être utilisée car c'est à partir de cette version que le changement de protocole est supporté.
Exemple : la requête HTTP |
GET /MaWebApp/echo HTTP/1.1
Cache-Control: no-cache
Connection: Upgrade
Host: localhost:8080
Origin: http://localhost:8080
Pragma: no-cache
Sec-WebSocket-Extensions: x-webkit-deflate-frame
Sec-WebSocket-Key: LwsTSMPv4TKzQscBprG1Iw==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 5.1)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
La réponse HTTP contient le code 101 pour indiquer que le serveur a changé de protocole pour utiliser le protocole WebSocket.
Exemple : la réponse HTTP |
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Sec-WebSocket-Accept:
9JUSDZQDUFa0yLScZ26xQdyzFy4=
Server: GlassFish Server Open Source
Edition 4.0
Upgrade: websocket
X-Powered-By: Servlet/3.1 JSP/2.3
(GlassFish Server Open Source Edition
4.0 Java/Oracle Corporation/1.7)
Une fois que le serveur a validé l'utilisation du protocole WebSocket, il n'est plus possible d'utiliser le protocole HTTP et tous les échanges suivants doivent utiliser le protocole WebSocket.
Si la connexion réussie, l'état de la WebSocket passe à l'état connected. Des données peuvent alors être échangées entre les deux endpoints de manière bi-directionnelle en mode full-duplex.
La fermeture de la connexion peut être à l'initiative du endpoint client ou serveur pour permettre de passer la WebSocket à l'état deconnected.
Le protocole WebSocket possède de nombreuses implémentations pour permettre sa mise en oeuvre côté client et serveur.
Plusieurs implémentations des WebSockets sont disponibles pour la plate-forme Java :
Les WebSocket ont été standardisées dans la plate-forme Java EE dans les spécifications de la JSR 356. La JSR 356 est ajoutée au Web Profile de Java EE 7. Plusieurs implémentations sont disponibles notamment Tyrus qui est l'implémentation de référence.
Le client peut utiliser n'importe quelle technologie qui propose un support des WebSockets, par exemple: