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.
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 modèle Web traditionnel est le proactif et le serveur est le passif. 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, et utilise WebSocket pour implémenter une salle de chat.
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 suivant doit également être exécuté sur Tomcat7.0.27 ou supérieur.
Code de serveur WebSocket
// Cette annotation est utilisée pour spécifier un URI, par lequel le client peut se connecter à WebSocket. Mappage d'annotation de type servlet. Pas besoin de le configurer dans web.xml. @ServerendPoint ("/ WebSocket") classe publique WebSocketDemo {// Variable statique utilisée pour enregistrer le nombre actuel de connexions en ligne. Il doit être conçu pour être fileté. Private Static final atomicInteger onlineCount = new AtomicInteger (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 <Shese WebSocketDemo> WebSocketSet = new CopyOnwriteArraySet <ShekocketDemo> (); // Définir un surnom de chat qui enregistre le surnom de chaîne finale privés du client; // Connectez une session de connexion avec un certain client et vous devez envoyer des données à la session privée du client; public WebsocketDemo () {Nonom = "invité" + onlineCount.getAndIncrement (); } / * * Utilisez l'annotation @onopen pour indiquer le retour après le succès du lien client. La session de paramètre est un paramètre facultatif Cette session est une session dans la spécification WebSocket, représentant une session. Pas httpSession * / @onopen public void onopen (session session) {this.Session = session; WebSocketEt.add (this); String Message = String.Format ("[% s,% s]", surnom, "Ajouter à Chat Room"); diffusion (message); System.out.println ("Onopen"); } / * * Utilisez l'annotation @onMessage pour indiquer quand le client envoie un message et que le premier paramètre indique les données envoyées par l'utilisateur. Le paramètre est un paramètre facultatif, qui est cohérent avec la session dans la session ONOpen * / @onMessage public void OnMessage (Message de chaîne, session de session) {// bien sûr True System.out.println (this.ession == session); Broadcast (String.Format ("% S:% S", surnom, filtre (message))); } / ** Rappel Une fois l'utilisateur qui a rompu le lien, notez que cette méthode doit être appelée après que le client a appelé la méthode du lien brisé * / @OnClose public void onclose () {WebsocketEt.Remove (this); String message = string.format ("[% s,% s]", surnom, "Laissez le lien de la salle de chat"); diffusion (message); } // Complete Mass Send Private void Broadcast (String info) {for (WebsocketDemo w: WebsocketEt) {try {synchronisé (WebSocketDemo.class) {w.sesion.getBasicRemote (). SendText (info); }} catch (ioException e) {System.out.println ("Envoyer le message au client" + w.nickName + "Échec du message"); WebSocketEt.Remove (W); essayez {w.Session.close (); } catch (ioException e1) {} string message = string.format ("[% s,% s]", w.nickname, "déconnecté"); diffusion (message); }}} // peut faire des demandes de filtrage pour les messages utilisateur, tels que le blocage des mots clés, etc. . Filtre de chaîne statique public (message de chaîne) {if (message == null) {return null; } retour du message; }}Client (page d'accueil Web) Code:
<! Doctype html> <html> <éadf> <meta charset = "utf-8"> <tight> Insérez le titre ici </ title> <script type = "text / javascript"> var ws = new WebSocket ("ws: // localhost: 8080 / WebSocketSt / Webocket"); / * * Écoutez les changements dans les trois états. JS Will Rappel * / ws.Openn = fonction (message) {}; ws.Onclose = function (message) {}; ws.OnMessage = function (message) {showMessage (message.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 () {ws.close (); }; // Ferme la fonction de connexion CloseWebSocket () {ws.close (); } // Envoyer une fonction de message envoyée () {var input = document.getElementById ("msg"); var text = input.value; Ws.Send (texte); input.value = ""; } fonction showMessage (message) {var text = document.CreateTextNode (message); var br = document.CreateElement ("br") var div = document.getElementById ("showchatMessage"); div.ApendChild (texte); Div.ApendChild (BR); } </ script> </ head> <body> <div id = "show"> <div id = "showchatMessage"> </ div> <input type = "text" size = "80" id = "msg" name = "msg" placeholder = "entre le contenu de chat" /> <entrée type = "Button" value = "send" id = "sendbn" name = "sendbn" name = "Sendbn" onClick = "Send ()"> </ body> </html>Comme mentionné ci-dessus, une salle de chat avec la fonction de chat de groupe est terminée. Au cours du processus de vérification, il a été constaté que l'utilisation de WebSocket peut compléter les demandes de domaine croisé.
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.