1. Eine kurze Einführung in WebSocket
Das WebSocket -Protokoll ist ein neues Protokoll für HTML5. Es implementiert die Full-Duplex-Kommunikation zwischen dem Browser und dem Server. Der anfängliche Handschlag erfordert die Hilfe von HTTP -Anfragen, um den Handschlag abzuschließen.
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.
Websocket -Hintergrund
Über HTTP im Browser kann nur eine Einweg-Kommunikation erreicht werden. Comet kann die wechselseitige Kommunikation in gewissem Maße simulieren, ist jedoch eine geringe Effizienz und erfordert eine gute Unterstützung durch den Server. Socket und XMLSocket in Flash können eine echte Zwei-Wege-Kommunikation realisieren, und diese beiden Funktionen können in JavaScript über Flex Ajax Bridge verwendet werden. Es kann vorhersehbar sein, dass, wenn WebSocket im Browser implementiert ist, die beiden oben genannten Technologien ersetzt und weit verbreitet ist. Angesichts dieser Situation definiert HTML5 das WebSocket-Protokoll, das die Serverressourcen und die Bandbreite besser speichern und eine Echtzeitkommunikation erreichen kann.
Das WebSocket -Protokoll wird auch in Javaee7 implementiert.
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.
2. Beispiel für Websocket
2.1. Erstellen Sie ein neues Javaweb -Testprojekt
Fügen Sie die Abhängigkeit von JAR -Paket in pom.xml hinzu
<Depepecy> <GroupId> Javax </GroupId> <artifactId> javaee-api </artifactId> <version>. </Version> <Scope> bereitgestellt </scope> </abhängig>
Client (Web Homepage) Code:
< %@ page Language = "java" pageCoding = "utf-" %> <! docType html> <html> <kopf> <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; // Bestimmen Sie, ob der aktuelle Browser WebSocketif ('WebSocket' in Fenster) {Websocket = New Browser unterstützt. WebSocket ("WS: // localhost:/webocket");} else {alert ('aktueller Browser nicht unterstützt WebSocket')} // Rückrufmethode für Fehler in der Verbindung WebSocket.onError = function () {setMessageInNerhtml ("WebSocket -Verbindungsfehler in WebSocket"}; // Callback -Methode für erfolgreiche Verbindungsverbindung in Websocket ")}; // Callback -Methode für erfolgreiche Verbindungsverbindung. {setMessageInnerHTML("WebSocket connection successful");}//Callback method for receiving message websocket.onmessage = function (event) {setMessageInnerHTML(event.data);}//Connection closed callback method websocket.onclose = function () {setMessageInnerHTML("WebSocket connection closed");}// Listen to the window closing Ereignis. 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 () {closeWebSocket ();} // Die Nachricht in der Webseitenfunktion setMessageInNerHtml (Innerhtml) {document.getElementById ('message'). InnerHtml + = InnerHtml + '<BR/>'; {WebSocket.CLOSE ();} // Nachrichtenfunktion senden send () {var message = document.getElementById ('text'). value; WebSocket.send (message);} </script> </html> Java Web Backend -Code
Paket me.gacl.websocket; import java.io.ioxception; import java.util.concurrent Seine Funktion besteht hauptsächlich darin, die aktuelle Klasse als WebSocket -Serverseite zu definieren. Der Wert der Annotation wird verwendet, um die Verbindung des Benutzers zur URL -Adresse des Terminalzugriffs des Benutzers anzuhören. Der Client kann über diese URL*/@Serverendpoint ("/webocket") öffentliche Klasse Websockettest {// statische Variablen zur Aufzeichnung der aktuellen Anzahl der Online -Verbindungen herstellen. Es sollte so ausgelegt sein, dass er mit Thread-Sicherheit ist. Private statische int onlineCount =; // Der Thread-Safe-Satz des gleichzeitigen Pakets wird verwendet, um das entsprechende MyWebsocket-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 private statische statische CopyonWriteArraySet <WEBOWSCOSTEST> WebSocketset = NewOnWriteArraySet <WEBSOCKETTEST> (); // Die Verbindungssitzung mit einem bestimmten Client an die Client -Session -Session;/*** -Methode zum Aufruf von der Verbindungssitzung mit einer bestimmten Clients -Sendungsanlage* @Param -Methode, die an die Client -Sessions -Session -Sitzung gesendet werden kann, identifizieren kann. Die Sitzung ist eine Verbindungssitzung mit einem bestimmten Client und muss Daten über ihn an den Client senden*/@onopenpublic void onopen (Sitzungssitzung) {this.Session = session; WebSocketSet.add (this); // in addonlineCount () in Set hinzufügen; // Hinzufügen zu System.out.println ("Es gibt eine neue Verbindung zum Beitritt! Die aktuelle Anzahl von Personen online ist" + getonlineCount ());}/*** Methode zum Verbinden von Closing Call*/@onclesepublic void onclose () {WebSocketSet.remove (this); // subonlineCount () aus dem Set löschen; // Decrement of Online -Number -System.out.println ("Es gibt eine Verbindung geschlossen! Die aktuelle Anzahl der Personen online ist" + getonlineCount ());}/*** Methode, die nach Empfangen der Client -Nachricht* @param meldung die von der Client gesendete Meldung von der Client* @param Session optionaler Parameter*/ @onmessagepublic void " + -System -Message) {String -Message, STING -Meldung, Session -Session -Session) {-System -Meldung: Message (String -Message) {system.Outln (" Message (String -Message) {system "message (String -Meldung) {system" message (String -Meldung) {String -Nachricht, Session -Session) {-System "Message: String -Nachricht, Session -Session) -System. Nachricht); // Batch -Nachricht für (WebSockettest Element: WebSocketetset) {try {item.sendMessage (message);} catch (ioException e) {e.printstacktrace (); Fortsetzung;}}}/*** Wenn ein Fehler auftritt* @Param Session* @param Fehler*/ @onerrorpublic void opton Fehler) {System.out.println ("Fehler aufgetreten"); 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 message* @throws IOException*/public void sendMessage(String message) throws IOException{this.session.getBasicRemote().sendText(message);//this.session.getAsyncRemote().sendText(message);}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addonlineCount () {WebSockettest.onlineCount ++;} public static synchronisierte void subonlineCount () {Websockettest.onlineCount-;}} 1.2. Betriebseffekt
Öffnen Sie den Google-Browser und den Firefox-Browser gleichzeitig für Simulationstests mit mehreren Klaren. Der Betriebseffekt ist wie folgt:
Der obige Inhalt ist das Beispiel -Tutorial für die Implementierung von WebSocket durch den Ihnen vorgestellten Java -Backend -Tomcat. Ich hoffe, es wird für alle hilfreich sein!