1. Une brève introduction à WebSocket
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.
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.
Client (page d'accueil Web) Code:
<% @ Page Language = "Java" Pageencoding = "UTF-8"%> <! 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 ()"> Close WebSocket Connection </ Button> <hr /> <div id = "message"> </ div> </ body> <script type = "text / javascript"> var Websocket = null; // juger si le navigateur actuel prend en charge WebSocket if ('WebSocket' dans la fenêtre) {WebSocket = new WebSocket ("ws: //172.16.98.31: 8080 / WebSocket / WebSocket"); } else {alert ('le navigateur actuel ne prend pas en charge WebSocket'); } // Méthode de rappel pour les erreurs dans la connexion WebSocket.onerror = function () {setMessageInnerHtml ("Erreur dans la connexion WebSocket"); }; // Méthode de rappel pour une connexion réussie WebSocket.onOpen = function () {setMessageInnerHtml ("WebSocket Connection réussie"); } // Méthode de rappel de réception du message WebSocket.onMessage = fonction (événement) {setMessageInnerHtml (event.data); }! } // Écoutez l'événement de clôture de la 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 (); } // Affichez le message sur la fonction Web SetMessageInnerHtml (innerHTML) {document.getElementById ('message'). InnerHtml + = innerHtml + '<br/>'; } // Fermer la fonction de connexion WebSocket ClosewWebSocket () {WebSocket.close (); } // Envoyer une fonction de message envoyée () {var message = document.getElementById ('text'). Valeur; WebSocket.Send (message); } </ script> </html> Code backend java
Package CN.com; Importer java.io.ioException; Importer java.util.concurrent.copyOnwriteArraySet; import javax.websocket. *; import javax.websocket.server.serverendpoint; / ** * @serverendpoint 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 d'annotation sera utilisée pour écouter la connexion de l'utilisateur à l'adresse URL d'accès au terminal. Le client peut se connecter à côté serveur WebSocket via cette URL * Chaque fois qu'une demande est faite, une instance sera créée * / @ severendpoint ("/ WebSocket") Classe publique WebSocketSest {// Les variables statiques sont utilisées pour enregistrer le nombre actuel de connexions en ligne. Il doit être conçu pour être fileté. Int statique privé inlineCount = 0; // 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 <SeboCKetSest> (); // La session de connexion avec un certain client doit envoyer des données au client via la session privée informatique; / ** * Méthode pour réussir l'appel de la connexion * @Param Session Paramètre facultatif. La session est une session de connexion avec un client, et elle doit envoyer des données au client via l'informatique * / @onopen public void onopen (session session) {this.Session = session; WebSocketEt.add (this); // ajouter à addonlineCount () dans set; // Ajouter 1 numéro de numéro en ligne.out.println ("Il existe une nouvelle connexion à rejoindre! Le nombre actuel de personnes en ligne est" + getOnlineCount ()); }! // delete SubonlineCount () de set; // Supprimer le numéro en ligne par 1 numéro en ligne System.out.println ("Il y a une connexion fermée! Le nombre actuel de personnes en ligne est" + getOnlineCount ()); } / ** * Méthode appelée après avoir reçu le message client * @param Message le message envoyé par le client * @Param Session Paramètre facultatif * / @onMessage public void OnMessage (message de chaîne, session session) {System.out.println ("Message à partir du client:" + message); // Message par lots pour (WebSocketTest Item: WebsocketEt) {try {item.sendMessage (message); } catch (ioException e) {e.printStackTrace (); continuer; }}}} / ** * Appelé lorsqu'une erreur se produit * @param session * @param error * / @onerror public void onError (session de session, errorable) {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.getasynCremote().SendText(Message); } public static synchronisé int getOnlineCount () {return onlineCount; } public static synchronisé void addonlineCount () {Websocketest.onlineCount ++; } public static synchronisé void subsonlineCount () {Websocketest.onlineCount--; }}Ouvrez deux navigateurs, entrez l'URL et exécutez-le directement
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.