Comment implémenter WebSocket à Tomcat
Le protocole WebSocket appartient à la norme HTML5, et de plus en plus de navigateurs ont pris en charge WebSocket, qui permet aux clients et aux serveurs de réaliser une communication bidirectionnelle. Après avoir établi une connexion WebSocket entre le client et le serveur, le message côté serveur peut être envoyé directement au client, brisant ainsi le mode de réponse à la demande traditionnelle et évitant les demandes dénuées de sens. Par exemple, la manière traditionnelle peut utiliser AJAX pour demander en continu le côté serveur, tandis que WebSocket peut envoyer directement des données au client et le client n'a pas à le demander. Dans le même temps, grâce à la prise en charge du navigateur natif, la rédaction d'applications client est devenue plus pratique et pas besoin de s'appuyer sur des plug-ins tiers. De plus, le protocole WebSocket abandonne les en-têtes de demande encombrants du protocole HTTP, mais les transmet sous forme de cadres de données, ce qui est plus efficace.
L'image montre le processus de communication du protocole WebSocket. Tout d'abord, le client enverra un package de poignée de main pour indiquer au serveur que je souhaite passer à WebSocket. Je ne sais pas si votre serveur est d'accord. À l'heure actuelle, si le serveur prend en charge le protocole WebSocket, il renverra un package de poignée de main pour indiquer au client qu'il n'y a pas de problème et que la mise à niveau a été confirmée. Ensuite, une connexion WebSocket a été établie avec succès, qui prend en charge la communication bidirectionnelle et envoie des messages à l'aide du format de trame de données du protocole WebSocket.
Le processus de poignée de main doit être expliqué. Afin de rendre le protocole WebSocket compatible avec l'architecture Web existante du protocole HTTP, la poignée de main du protocole WebSocket doit être basée sur le protocole HTTP. Par exemple, le client enverra des messages HTTP similaires à la demande suivante à la demande du serveur pour passer au protocole WebSocket. La mise à niveau: WebSocket indique au serveur que je souhaite mettre à niveau le protocole:
Get ws: // localhost: 8080 / Hello http / 1.1 Origin: http: // localhost: 8080 Connexion: mise à niveau hôte: localhost: 8080 Sec-websocket-key: urovsczjnol / umbtt5ukmw == mise à niveau: WebSocket Sec-Websocket-Version: 13
À l'heure actuelle, si le serveur prend en charge le protocole WebSocket, il enverra un message qui s'accorde au protocole de mise à niveau du client. Le message spécifique est similaire à ce qui suit, où la mise à niveau: WebSocket indique au client que j'accepte votre protocole de mise à niveau:
HTTP / 1.1 101 Date de poignée de main ProtoCol WebSocket: ven, 10 février 2016 17:38:18 Connexion GMT: serveur de mise à niveau: mise à niveau de la passerelle Kaazing: WebSocket SEC-WebSocket-Accept: RLHCKW / SKSO9GAH / ZSFHBATDKRU =
Après avoir terminé la poignée de main comme ci-dessus, la connexion du protocole HTTP est cassée. Ensuite, vous commencez à utiliser le protocole WebSocket pour communiquer entre les deux parties. Cette connexion est toujours la connexion TCP / IP d'origine, et le port est toujours le 80 ou 443 d'origine.
Voici un exemple simple d'écriture WebSocket dans Tomcat:
classe publique HelloweBSocketServlet étend WebSocketServlet {private static List <MessageInbound> socketList = new ArrayList <MessageInbound> (); protégé StreamInBound CreateEWeBSocketInbound (String Subprotocol, httpServLetRequest request) {return new WebSocketMessageInbound (); } classe publique WebSocketMessageInbound étend MessageInbound {Protected void onClose (int status) {super.OnClose (status); socketList.Remove (this); } Protected void onopen (wsoutBound Outbound) {super.onopen (Outbound); socketList.add (this); } @Override Protected void onbinaryMessage (ByteBuffer Message) lève IoException {} @Override Protected void onTextMessage (Charbuffer Message) lance IoException {for (MessageInbound MessageInbound: SocketList) {Charbuffer Buffer = Charbuffer.wrap (message); WsOutBound Outbound = MessageInbound.getWsoutBound (); outbound.writeTextMessage (tampon); Outbound.flush (); }}}}Ce servlet doit hériter de WebSocketServlet, puis créer une classe WebSocketMessageInbound qui hérite de MessageInbound. Remplissez l'onclose, onopen, onbinaryMessage et onTextMessage dans cette classe pour terminer la logique de chaque événement. OnOpen sera appelé lorsqu'une connexion WebSocket sera établie, ONCLOSE sera appelée lorsqu'un WebSocket sera fermé, OnbinaryMessage est appelé lorsqu'une données client est reçue en mode binaire et que OnTextMessage est appelé lorsqu'une données client est reçue en mode texte. Le code ci-dessus implémente l'effet d'une diffusion.
Selon la logique de traitement ci-dessus, l'intégration de Webcat de Tomcat ne sera pas trop difficile. Cela signifie que si vous rencontrez une demande de protocole WebSocket lors du traitement d'une demande, vous effectuerez un traitement spécial, conserverez la connexion et appelez les méthodes ONCLOSE, ONOPEN, OnbinaryMessage et OnTextMessage des méthodes MessageInbound de WebSockEservlet au moment approprié. Étant donné que WebSocket est généralement recommandé d'être utilisé en mode NIO, regardez le protocole WebSocket d'intégration Nio Mode.
Comme le montre la figure, si la connexion client du WebSocket est reçue par le récepteur et enregistrée dans la file d'attente Niochannel, le composant Poller continue de reposer s'il y a un niochannel à gérer. Si c'est le cas, il passera par le pipeline de traitement vers le servlet héritant de WebSocketServlet. La méthode DoGet du WebSocketServlet gérera la poignée de main WebSocket et indiquera au client Retour d'accepter l'accord de mise à niveau. Plus tard, Poller a continué à décoller le niochannel connexe. Une fois qu'il a été découvert que le pipeline utilisant le protocole WebSocket a été utilisé, il appellerait la méthode MessageInbound pour terminer le traitement de différents événements, réalisant ainsi la prise en charge du protocole WebSocket.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!