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.
Das herkömmliche HTTP -Protokoll ist aufstandslos. 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 traditionellem Webmodell ist proaktiv und der Server ist der passive. 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.
** Zusammen mit dem Start von HTML5 realisiert WebSocket wirklich die Echtzeitkommunikation des Webs, sodass der B/S-Modus die Echtzeit-Kommunikationsfunktionen des C/S-Modus aufweist. ** 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 in Java Web einführt und WebSocket verwendet, um einen Chatraum zu implementieren.
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 Code muss auch auf Tomcat7.0.27 oder höher ausgeführt werden.
WebSocket -Servercode
// Mit dieser Annotation wird ein URI angegeben, durch den der Client eine Verbindung zum WebSocket herstellen kann. Servlet-ähnliche Annotationskartierung. Es ist nicht erforderlich, es in Web.xml zu konfigurieren. @ServerendPoint ("/WebSocket") öffentliche Klasse WebSocketDemo {// statische Variable verwendet, um die aktuelle Anzahl der Online -Verbindungen aufzuzeichnen. Es sollte so ausgelegt sein, dass er mit Thread-Sicherheit ist. private statische endgültige Atomicinger OnlineCount = New AtomicInteger (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 <EbsocketDemo> webSocketset = new CopyonWriteArraySet <EbsocketDemo> () identifizieren kann. // Definieren Sie einen Chat -Spitznamen, mit dem der Client private endgültige String -Spitzname aufgezeichnet wird. // Verbinden Sie eine Verbindungssitzung mit einem bestimmten Client, und Sie müssen Daten an die private Sitzung der Kunden senden. public WebSocketDemo () {Spickname = "gäste" + onlineCount.getandIncrement (); } / * * Verwenden Sie die @onopen -Annotation, um die Rückgabe anzugeben, nachdem der Client -Link erfolgreich ist. Parametersitzung ist optionaler Parameter Diese Sitzung ist eine Sitzung in der WebSocket -Spezifikation, die eine Sitzung darstellt. Nicht httpSession */ @onopen public void onopen (Sitzungssitzung) {this.Session = session; WebSocketSet.Add (this); String message = string.format ("[%s,%s]", Spitzname, "zum Chatraum hinzufügen"); Sendung (Nachricht); System.out.println ("Onopen"); }/ * * Verwenden Sie die @onMessage -Annotation, um anzugeben, wann der Client eine Nachricht sendet, und der erste Parameter gibt die vom Benutzer gesendeten Daten an. Die Parametersitzung ist ein optionaler Parameter, der mit der Sitzung in der Onopen -Methode übereinstimmt. Broadcast (String.Format ("%s:%s", Spitzname, Filter (Nachricht))); }/ ** Rückruf Nachdem der Benutzer den Link unterrichtet hat, beachten Sie, dass diese Methode aufgerufen werden muss, nachdem der Client die kaputte Linkmethode*/ @onclose public void onclose () {WebSocketSet.remove (this); String message = string.format ("[%s,%s]", Spitzname, "den Chatroom -Link verlassen"); Sendung (Nachricht); } // Mass mass Senden Sie private void Broadcast (String Info) {für (WebSocketDemo W: WebSocketSet) {try {synchronized (WebSocketDemo.class) {w.session.getBasicremote (). SendText (Info); }} catch (ioException e) {System.out.println ("Nachricht an client senden"+W.Nickname+"Meldung nicht gesendet"); WebSocketset.Remove (W); try {w.session.close (); } catch (ioException e1) {} String message = string.format ("[%s,%s]", W.Nickname, "getrennt"); Sendung (Nachricht); }}} // kann einige Filteranforderungen für Benutzernachrichten erstellen, z. B. Blockieren von Schlüsselwörtern usw.. . public static String Filter (String -Nachricht) {if (message == null) {return null; } Rückgabenachricht; }}Client (Web Homepage) Code:
<! DocType html> <html> <kopf> <meta charset = "utf-8"> <title> Title hier einfügen </title> <script type = "text/javascript"> var ws = new WebSocket ("WS: // localhost: 8080/webSockettest/webSocket"); / * * Hören Sie sich Änderungen in den drei Staaten an. JS wird zurückrufen*/ ws.onopen = function (message) {}; ws.onclose = function (message) {}; ws.onMessage = function (message) {showMessage (message.data); }; // 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.onbeforeUpLoad = function () {Ws.Close (); }; // Schließen Sie die Verbindungsfunktion in CloseWebSocket () {Ws.CLOSE (); } // eine Nachrichtenfunktion senden send () {var input = document.getElementById ("msg"); var text = input.Value; ws.send (Text); input.Value = ""; } function showMessage (message) {var text = document.createTextNode (message); var br = document.createelement ("br") var div = document.getElementById ("showchatMessage"); Div.AppendChild (Text); Div.AppendChild (BR); } </script> </head> <body> <div id = "show"> <div id = "showchatMessage"> </div> <Eingabe type = "text" size = "80" id = "msg" name = "msg" placeholder = "Chat -Inhalt eingeben"/> <input type "button onclick = "send ()"> </body> </html>Wie oben erwähnt, ist ein Chatraum mit Gruppen -Chat -Funktion abgeschlossen. Während des Überprüfungsprozesses wurde festgestellt, dass die Verwendung von Websocket Cross-Domänen-Anforderungen abschließen kann.
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.