1. Eine kurze Einführung in WebSocket
Mit der Entwicklung des Internets waren traditionelle HTTP -Protokolle schwierig, die zunehmend komplexen Anforderungen von Webanwendungen zu erfüllen. In den letzten Jahren wurde mit der Geburt von HTML5 das WebSocket -Protokoll vorgeschlagen. Es realisiert die Full-Duplex-Kommunikation zwischen dem Browser und dem Server, erweitert die Kommunikationsfunktion zwischen dem Browser und dem Server und ermöglicht es dem Server, Daten aktiv an den Client zu senden.
Wir wissen, dass das traditionelle HTTP -Protokoll aufstandslos ist. Jede Anfrage muss vom Client (z. B. ein Browser) eingeleitet werden. Nach der Verarbeitung gibt der Server das Antwortergebnis zurück. Für den Server ist es schwierig, Daten aktiv an den Client zu senden. Diese Art von Client ist die aktive Partei und der Server ist die passive Partei. Das traditionelle Webmodell verursacht weniger Probleme für Webanwendungen mit seltenen Änderungen der Informationsanwendungen, bringt jedoch große Unannehmlichkeiten für Webanwendungen mit Echtzeitinformationen, wie z. B. Anwendungen mit Funktionen wie Sofortkommunikation, Echtzeitdaten, Abonnement-Push usw. Bevor die Webocket-Spezifikation vorgeschlagen wurde, verwenden Entwickler häufig Kompromisselösungen. Tatsächlich ist Letzteres im Wesentlichen eine Art Umfragen, wurde aber verbessert.
Umfragen sind die originellste Lösung für die Implementierung von Webanwendungen in Echtzeit. Für die Polling -Technologie müssen Clients regelmäßig Anforderungen an den Server in einem festgelegten Zeitintervall senden und häufig abfragen, ob neue Datenänderungen vorliegen. Offensichtlich kann dieser Ansatz zu zu vielen unnötigen Anfragen führen, die Verkehr und Serverressourcen verschwenden.
Die Kometentechnologie kann in lange Wahl- und Streaming -Technologie unterteilt werden. Lange Umfragen verbessert die oben genannte Umfragetechnologie und verringert nutzlose Anfragen. Es legt eine Ablaufzeit für bestimmte Daten fest und sendet nach Ablauf der Daten nur eine Anforderung an den Server. Dieser Mechanismus eignet sich für Situationen, in denen Datenänderungen nicht besonders häufig sind. Die Streaming -Technologie bezieht sich normalerweise auf den Client, der ein verstecktes Fenster verwendet, um eine http -lange Verbindung mit dem Server herzustellen. Der Server aktualisiert ständig den Verbindungsstatus, um die HTTP -lange Verbindung am Leben zu erhalten. Auf diese Weise kann der Server Daten über diese lange Verbindung aktiv an den Client senden. Die Streaming -Technologie kann die Leistung des Servers in einer großen Parallelitätsumgebung testen.
Beide Technologien basieren auf dem Anforderungs-Wirkungs-Modus und gelten im wahrsten Sinne nicht als Echtzeit-Technologien. Jede Anfrage oder Antwort ihrer Abfälle ist ein gewisses Maß an Verkehr auf denselben Header -Informationen, und die Entwicklungskomplexität ist ebenfalls hoch.
Mit dem Start von HTML5 realisiert WebSocket wirklich die Echtzeitkommunikation des Webs, sodass der B/S-Modus die Echtzeit-Kommunikationsfunktionen des C/S-Modus enthält. Der Workflow von WebSocket lautet wie folgt: Der Browser sendet eine Anfrage an den Server, um eine WebSocket -Verbindung über JavaScript herzustellen. Nachdem die WebSocket -Verbindung erfolgreich hergestellt wurde, kann der Client und der Server Daten über die TCP -Verbindung übertragen. Da WebSocket -Verbindung im Wesentlichen eine TCP -Verbindung ist, müssen bei jeder Übertragung keine wiederholten Header -Daten übertragen werden, sodass sein Datenübertragungsvolumen viel kleiner ist als die Pollierung und die Comet -Technologie. In diesem Artikel wird die WebSocket -Spezifikation nicht ausführlich vorgestellt, sondern hauptsächlich die Implementierung von WebSocket im Java -Web einführt.
Javaee 7 hat JSR-356: Java API für die Websocket-Spezifikation erstellt. Viele Webcontainer wie Tomcat, Nginx, Jetty usw. unterstützen WebSocket. Tomcat unterstützt WebSocket seit 7.0.27 und JSR-356 seit 7.0.47. Der folgende Demo -Code muss auch auf Tomcat7.0.47 oder höher bereitgestellt werden.
Client (Web Homepage) Code:
< %@ page Language = "java" pageCoding = "utf-8" %> <! docType html> <html> <Head> <title> Tomcat-Implementierung von Java Backend WebSocket </title> </head> <body> Willkommen <br/> <Eingabe id = "text" text onclick = "closeWebSocket ()"> WebSocket -Verbindung schließen </button> <hr/> <div id = "message"> </div> </body> <script type = "text/javascript"> var webocket = null; // Beurteilen Sie, ob der aktuelle Browser WebSocket if ('WebSocket' im Fenster) unterstützt {WebSocket = new WebSocket ("WS: //172.16.98.31: 8080/WebSocket/WebSocket"); } else {alert ('aktueller Browser nicht unterstützt WebSocket'); } // Rückrufmethode für Fehler in der Verbindung webSocket.onerror = function () {setMessageInnerhtml ("Fehler in der WebSocket -Verbindung"); }; // Rückrufmethode für eine erfolgreiche Verbindung webocket.onopen = function () {setMessageInnerHtml ("WebSocket -Verbindung erfolgreich"); } // Rückrufmethode zum Empfangen der Nachricht WebSocket.onMessage = Funktion (Ereignis) {setMessageInnerhtml (Ereignis.Data); } // Rückrufmethode der Verbindungsverbindung Schließe WebSocket.onclose = function () {setMessageInnerhtml ("WebSocket -Verbindung geschlossen"); } // Hören Sie sich das Fensterschließereignis an. Wenn das Fenster geschlossen ist, schließen Sie aktiv die WebSocket -Verbindung, um zu verhindern, dass das Fenster schließt, bevor die Verbindung getrennt wird, und die Serverseite wird Ausnahmen auswirken. window.onbeforeUload = function () {condwebSocket (); } // Die Nachricht auf der Webseitenfunktion setMessageInNerHtml (InnerHtml) {document.getElementById ('message'). InnerHtml + = InnerHtml + '<br/>' '; } // WebSocket -Verbindungsfunktion schließen closeWebSocket () {WebSocket.CLOSE (); } // Nachrichtenfunktion senden send () {var message = document.getElementById ('text'). Wert; WebSocket.Send (Nachricht); } </script> </html> Java Web Backend -Code
Paket cn.com; importieren java.io.ioxception; import java.util.concurrent.copyonwriteArraySet; import Javax.Websocket. Seine Funktion besteht hauptsächlich darin, die aktuelle Klasse als WebSocket -Serverseite zu definieren. * Der Annotationswert wird verwendet, um die Verbindung des Benutzers mit der URL -Adresse des Terminalzugriffs anzuhören. Der Client kann jedes Mal, wenn eine Anfrage gestellt wird, eine Verbindung zur WebSocket -Serverseite über diese URL* herstellen. Eine Instanz wird erstellt*/@Serverendpoint ("/WebSocket") Public Class WebSockettest {// statische Variablen werden verwendet, um die aktuelle Anzahl der Online -Verbindungen aufzuzeichnen. Es sollte so ausgelegt sein, dass er mit Thread-Sicherheit ist. private static int onlinecount = 0; // Der Thread-Safe-Set des gleichzeitigen Pakets wird verwendet, um das entsprechende MyWebocket-Objekt jedes Clients zu speichern. Um zu erkennen, dass der Server mit einem einzelnen Client kommuniziert, können Sie MAP zum Speichern verwenden, wobei der Schlüssel den Benutzer privat staticOnWriteArraySet <WEBOWSCOTTEST> WebSocketSet = New CopyonWriteArraySet <WEBOWSCOTHETTEST> () identifizieren kann. // Die Verbindungssitzung mit einem bestimmten Kunden muss Daten über die private Sitzung an den Kunden senden. /*** Methode zum erfolgreichen Aufruf von Verbindungsanträgen* @Param Session Optionaler Parameter. Die Sitzung ist eine Verbindungssitzung mit einem Kunden und muss Daten über ihn über ihn senden*/ @onopen public void onopen (Sitzungssitzung) {this.Session = Sitzung; WebSocketSet.Add (this); // in addonlineCount () in Set hinzufügen; // 1 Online -Number -System hinzufügen. } / *** Methode zum Verbinden von Schließanrufen* / @onclose public void onclose () {WebSocketset.remove (this); // subonlineCount () aus dem Set löschen; // Online -Nummer löschen nach 1 Online -Nummer System.out.println ("Es wird eine Verbindung geschlossen! Die aktuelle Anzahl der Online -Personen ist" + GetonlineCount ()); } / *** Methode, die nach dem Empfangen der Client -Nachricht* @param -Nachricht angerufen wurde. // Batch -Nachricht für (WebSockettest Element: WebSocketSet) {try {item.sendMessage (message); } catch (ioException e) {e.printstacktrace (); weitermachen; }}}} / ** * aufgerufen, wenn ein Fehler auftritt ERROR.PRINTSTACKTRACE (); } /*** Diese Methode unterscheidet sich von den oben genannten Methoden. Es gibt keine Annotation, es handelt sich um eine Methode, die entsprechend Ihren Anforderungen hinzugefügt wird. * @param meldung * @throws ioException */ public void sendMessage (String meldung) löst IOException {this.Session.getBasicremote (). SendText (Message) aus. //this.session.getasyncremote().SendText(Message); } public static synchronisierte int getonlineCount () {return onlineCount; } public static synchronisierte void addonlineCount () {WebSockettest.onlineCount ++; } public static synchronisierte void subonlineCount () {WebSockettest.onlineCount--; }}Öffnen Sie zwei Browser, betreten Sie die URL und führen Sie sie direkt aus
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.