1. Une brève introduction à WebSocket
Le protocole WebSocket est un nouveau protocole pour HTML5. Il met en œuvre une communication complète-duplex entre le navigateur et le serveur. La poignée de main initiale nécessite l'aide des demandes HTTP pour compléter la poignée de main.
Avec le développement d'Internet, les protocoles HTTP traditionnels ont été difficiles à répondre aux besoins de plus en plus complexes des applications Web. Ces dernières années, avec la naissance de HTML5, le protocole WebSocket a été proposé. Il réalise la communication complète entre le navigateur et le serveur, élargit la fonction de communication entre le navigateur et le serveur et permet au serveur d'envoyer activement des données au client.
Bondage WebSocket
Seule une communication unidirectionnelle peut être réalisée via HTTP dans le navigateur. La comète peut simuler la communication bidirectionnelle dans une certaine mesure, mais elle est faible en efficacité et nécessite un bon support du serveur; Socket et XMLSocket dans Flash peuvent réaliser une véritable communication bidirectionnelle, et ces deux fonctions peuvent être utilisées dans JavaScript via Flex Ajax Bridge. Il peut être prévisible que si WebSocket est implémenté dans le navigateur, il remplacera les deux technologies ci-dessus et sera largement utilisé. Face à cette situation, HTML5 définit le protocole WebSocket, qui peut mieux économiser les ressources du serveur et la bande passante et réaliser une communication en temps réel.
Le protocole WebSocket est également mis en œuvre dans Javaee7.
Nous savons que le protocole HTTP traditionnel est apatride. Chaque demande doit être lancée par le client (comme un navigateur). Après traitement, le serveur renvoie le résultat de la réponse. Il est difficile pour le serveur d'envoyer activement des données au client. Ce type de client est la partie active et le serveur est la partie passive. Le modèle Web traditionnel cause moins de problèmes pour les applications Web avec des modifications d'informations peu fréquentes, mais elle apporte de grands inconvénients aux applications Web impliquant des informations en temps réel, telles que des applications avec des fonctions telles que la communication instantanée, les données en temps réel, la poussée d'abonnement, etc. Avant que les spécifications de WebSocket ne soient proposées, les développeurs utilisent souvent des solutions de compromis pour mettre en œuvre ces fonctions hautement en temps réel: les techniques de la pollugie et de la COMET. En fait, ce dernier est essentiellement une sorte de sondage, mais il a été amélioré.
Le sondage est la solution la plus originale pour implémenter des applications Web en temps réel. La technologie de sondage nécessite que les clients envoient périodiquement des demandes au serveur à un intervalle de temps défini et interrogent fréquemment s'il y a de nouveaux changements de données. De toute évidence, cette approche peut conduire à trop de demandes inutiles, gaspillant le trafic et les ressources du serveur.
La technologie COMET peut être divisée en technologie de sondage et de streaming longs. Le sondage long améliore la technologie de sondage susmentionnée, réduisant les demandes inutiles. Il définit un temps d'expiration pour certaines données et n'envoie une demande au serveur qu'après l'expiration des données; Ce mécanisme convient aux situations où les changements de données ne sont pas particulièrement fréquents. La technologie de streaming fait généralement référence au client à l'aide d'une fenêtre cachée pour établir une connexion longue HTTP avec le serveur. Le serveur mettra constamment à jour l'état de connexion pour maintenir la connexion longue HTTP en vie; De cette façon, le serveur peut envoyer activement des données au client via cette longue connexion; La technologie de streaming peut tester les performances du serveur dans un grand environnement de concurrence .
Les deux technologies sont basées sur le mode de demande-réponse et ne sont pas considérées comme des technologies en temps réel au sens réel; Chaque demande ou réponse de leurs déchets d'une certaine quantité de trafic sur les mêmes informations d'en-tête, et la complexité de développement est également élevée.
Avec le lancement de HTML5, WebSocket réalise vraiment la communication en temps réel du Web, ce qui fait que le mode B / S a les capacités de communication en temps réel du mode C / S. Le flux de travail de WebSocket est le suivant: Le navigateur envoie une demande au serveur pour établir une connexion WebSocket via JavaScript. Une fois la connexion WebSocket établie avec succès, le client et le serveur peuvent transmettre des données via la connexion TCP. Étant donné que la connexion WebSocket est essentiellement une connexion TCP, elle ne nécessite pas de données d'en-tête répétées à chaque transmission, de sorte que son volume de transmission de données est beaucoup plus petit que la technologie de sondage et de comète. Cet article ne présente pas la spécification WebSocket en détail, mais introduit principalement l'implémentation de WebSocket dans Java Web.
Javaee 7 a créé JSR-356: API Java pour la spécification WebSocket. De nombreux conteneurs Web, tels que Tomcat, Nginx, Jetty, etc., prennent en charge WebSocket. Tomcat prend en charge WebSocket depuis 7.0.27 et JSR-356 depuis 7.0.47. Le code de démonstration suivant doit également être déployé sur TOMCAT7.0.47 ou supérieur à l'exécution.
2. Exemple WebSocket
2.1. Créer un nouveau projet de test Javaweb
Ajouter une dépendance du package JAR dans pom.xml
<dependency> <proupId> javax </proncId> <Artifactid> javaee-api </refactive> <version>. </preinte> <ccope> fourni </ccope> </dependency>
Client (page d'accueil Web) Code:
<% @ Page Language = "Java" Pageencoding = "UTF-"%> <! DocType Html> <html> </ Head> <Title> Tomcat Implémentation de Java Backend WebSocket </ Title> </ Head> <Body> Bienvenue <br/> <Entrée Id = "Text" Type = "Text" /> <bouton OnClick = "Send ()"> onclick = "closewwebsocket ()"> clôture de connexion WebSocket </ bouton> <hr /> <div id = "message"> </ div> </ body> <script type = "text / javascript"> var WebSocket = null; // déterminer si le navigateur actuel prend en charge WebSocket ('WebSocket' dans Window) {WebSocket = new WebSocket ("ws: // localhost: / websocket");} {alert ('le navigateur actuel ne prend pas en charge WebSocket')} // Méthode de rappel pour les erreurs dans la connexion WebSocket.onerror = function () {setMessageInnerHtml ("Erreurs de connexion WebSocket dans WebSocket");}; // Méthode de callback pour la connexion réussie WebSocket.onOpen = Function () {setMessageInnerHtml ("WebSocket Connexion");} WebSocket.Onmesage = function (Event) {setMessageInnerHtml (event.Data);} // Connection Méthode de rappel clôturé WebSocket.OnClose = function () {SetMessageInnerHtml ("WebSocket Connection closed");} // Écoutez l'événement de fermeture de fenêtre. Lorsque la fenêtre est fermée, fermez activement la connexion WebSocket pour empêcher la fermeture de la fenêtre avant la déconnexion de la connexion et le côté serveur lancera des exceptions. window.onbeforeUnload = function () {closewwebsocket ();} // affiche le message sur la page Web function setMessageInnerHtml (innerHtml) {document.getElementByid ('message'). InnerHtml + = innerHtml + '<br/>';} // Fonction de connexion Close Closewebsocket () {WebSocket. function Send () {var message = document.getElementById ('Text'). Valeur; WebSocket.Send (message);} </cript> </html> Code backend java
package me.gacl.websocket; import java.io.ioexception; import java.util.concurrent.copyonwritearrayset; import javax.websocket. *; import javax.websocket.server.serverendpoint; / *** @serverendpoint. L'annotation est une annotation de niveau de classe. Sa fonction consiste principalement à définir la classe actuelle comme un côté serveur WebSocket. La valeur de l'annotation sera utilisée pour écouter la connexion de l'utilisateur à l'adresse URL de l'accès terminal de l'utilisateur. Le client peut se connecter à côté serveur WebSocket via cette classe URL * / @ severendPoint ("/ WebSocket") Websocketest {// Variables statiques utilisées pour enregistrer le nombre actuel de connexions en ligne. Il doit être conçu pour être fileté. Int statique privé inlineCount =; // L'ensemble de filetage du package simultané est utilisé pour stocker l'objet MyWebSocket correspondant de chaque client. Pour réaliser que le serveur communique avec un seul client, vous pouvez utiliser MAP pour le stocker, où la clé peut identifier l'utilisateur Static CopyOnwriteArraySet <SeabsocketSest> WebSocketSet = new CopyOnwriteArraySet <WebSocketSest> (); // La session de connexion avec un certain client doit être envoyée au client via la session privée de la session privée; / *** Méthode pour avoir réussi à appeler l'établissement de connexion * @PaMaM Session Pionter. La session est une session de connexion avec un certain client, et elle doit envoyer des données au client via l'informatique * / @ openPublic void onopen (session session) {this.Session = session; WebsocketSet.add (this); // ajouter à addonlineCount () dans set; // Ajouter à System.out.println ("Il existe une nouvelle connexion à rejoindre! Le nombre actuel de personnes en ligne est" + getOnlineCount ());} / *** Méthode pour connecter l'appel de fermeture * / @ onclosePublic void onclose () {WebsocketSet.Remove (this); // delete SubonlineCount () de set; //Decrement of online number System.out.println("There is a connection closed! The current number of people online is" + getOnlineCount());}/*** Method called after receiving the client message* @param message The message sent by the client* @param session Optional parameter*/@OnMessagepublic void onMessage(String message, Session session) {System.out.println("Message from the client:" + message);//Batch message for(WebSocketTest item: webSocketSet){try {item.sendMessage(message);} catch (IOException e) {e.printStackTrace();continue;}}}/*** Called when an error occurs * @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable Error) {System.out.println ("Erreur s'est produite"); error.printStackTrace ();} / *** Cette méthode est différente des méthodes ci-dessus. Il n'y a pas d'annotation, c'est une méthode ajoutée en fonction de vos besoins. * @param message * @throws ioException * / public void SendMessage (String Message) lève ioException {this.session.getBasicRemote (). SendText (message); // this.session.getasynCreme (). SendText (message);} public static synchronisé into GetonlineCount () {return onlineCount;} public static static synchronized voide () {return onlineCount;} public static synchronized void voide () ot addOnlineCount () {WebsocketSt.onlineCount ++;} public static synchronisé void subonlineCount () {Websockettest.onlineCount--;}} 1.2. Effet de fonctionnement
Ouvrez le navigateur Google et le navigateur Firefox en même temps pour des tests de simulation multi-autres. L'effet de fonctionnement est le suivant:
Le contenu ci-dessus est l'exemple de didacticiel pour implémenter WebSocket par le backend Java Tomcat présenté. J'espère que ce sera utile à tous!