So implementieren Sie WebSocket in Tomcat
Das WebSocket-Protokoll gehört zum HTML5-Standard, und immer mehr Browser haben WebSocket nativ unterstützt, wodurch Clients und Server eine wechselseitige Kommunikation erreichen können. Nach der Erstellung einer WebSocket-Verbindung zwischen dem Client und dem Server kann die serverseitige Nachricht direkt an den Client gesendet werden, so Beispielsweise kann der traditionelle Weg AJAX verwenden, um die Serverseite kontinuierlich anzufordern, während WebSocket Daten direkt an den Client senden kann und der Client es nicht anfordern muss. Gleichzeitig ist das Schreiben von Client-Anwendungen dank des nativen Browser-Supports bequemer geworden und muss sich nicht auf Plug-Ins von Drittanbietern verlassen. Darüber hinaus verlangt das WebSocket -Protokoll die umständlichen Anforderungen des HTTP -Protokolls, überträgt es jedoch in Form von effizienterer Datenrahmen.
Das Bild zeigt den Prozess der Websocket -Protokollkommunikation. Zunächst sendet der Client ein Handshake -Paket, um dem Server mitzuteilen, dass ich auf WebSocket upgraden möchte. Ich weiß nicht, ob Ihr Server zustimmt. Wenn der Server das WebSocket -Protokoll unterstützt, gibt es zu diesem Zeitpunkt ein Handshake -Paket zurück, um dem Client mitzuteilen, dass es kein Problem gibt und das Upgrade bestätigt wurde. Anschließend wurde eine WebSocket-Verbindung erfolgreich hergestellt, die eine Zwei-Wege-Kommunikation unterstützt und Nachrichten über das Datenbildformat des WebSocket-Protokolls sendet.
Der Handshake -Prozess muss erklärt werden. Um das WebSocket -Protokoll mit der vorhandenen HTTP -Protokoll -Webarchitektur kompatibel zu machen, muss der Handschlag des WebSocket -Protokolls auf dem HTTP -Protokoll basieren. Beispielsweise sendet der Client HTTP -Nachrichten ähnlich wie folgt an die Serveranforderung, um auf das WebSocket -Protokoll zu aktualisieren. Das Upgrade: WebSocket teilt dem Server mit, dass ich das Protokoll aktualisieren möchte:
Holen Sie sich WS: // localhost: 8080/Hallo http/1.1 Ursprung: http: // localhost: 8080 Verbindung: Upgrade Host: localhost: 8080 sec-websocket-key: urrovsczjnol/Umbtt5ukmw == Upgrade: WebSocket Sec-Wbsocket-Version: 13 13
Wenn der Server das WebSocket -Protokoll unterstützt, wird zu diesem Zeitpunkt eine Nachricht gesendet, die dem Upgrade -Protokoll des Kunden zustimmt. Die spezifische Nachricht ähnelt dem folgenden, wobei Upgrade: WebSocket dem Client mitteilt, dass ich Ihrem Upgrade -Protokoll zustimme:
HTTP/1.1 101 WebSocket Protocol Handshake Datum: Fr, 10. Februar 2016 17:38:18 GMT-Verbindung: Upgrade Server: Kaazing Gateway Upgrade: WebSocket Sec-Websocket-Akzept: RLHCKW/SKSO9GAH/ZSFHBATDKRU =
Nach Abschluss des Handschlags wie oben ist die HTTP -Protokollverbindung unterbrochen. Als nächstes verwenden Sie das WebSocket -Protokoll, um zwischen den beiden Parteien zu kommunizieren. Diese Verbindung ist nach wie vor die ursprüngliche TCP/IP -Verbindung, und der Port ist immer noch die ursprüngliche 80 oder 443.
Hier ist ein einfaches Beispiel dafür, Websocket in Tomcat zu schreiben:
public class helloWebsocketServlet erweitert WebSocketServlet {private statische Liste <StaceInbound> SocketList = New ArrayList <StousInbound> (); Protected Streaminbound Createwebsocketinbound (String subProtocol, httpServletRequest -Anforderung) {Neue WebSocketMessageInbound () zurückgeben; } öffentliche Klasse WebSocketMessageInbound erweitert MessageInbound {Protected void onclose (int Status) {Super.onclose (Status); SocketList.Remove (this); } protected void onopen (wSoutbound outbound) {Super.onopen (Outbound); SocketList.add (this); } @Override Protected void onBinaryMessage (ByteBuffer -Nachricht) löst IOException aus {} @Override Protected void OnTextMessage (Charbuffer -Nachricht) löst IoException {for (messageInbound messing: socketlist) {Charbuffer Buffer = Charbuffer.writer (Message); WSoutBound Outbound = messageInbound.getWSoutBound (); outbound.WritETextMessage (Puffer); outbound.flush (); }}}}Dieses Servlet muss das WebSocketServlet erben und anschließend eine WebSocketMessageInbound -Klasse erstellen, die MessageInbound erbt. In dieser Klasse die Logik jedes Ereignisses vervollständigen, um die Logik jedes Ereignisses zu vervollständigen. Onopen wird aufgerufen, wenn eine WebSocket -Verbindung hergestellt wird. Onclose wird aufgerufen, wenn ein WebSocket geschlossen ist. OnardaryMessage wird aufgerufen, wenn ein Clientdaten im Binärmodus empfangen wird, und OnTextMessage wird aufgerufen, wenn ein Clientdaten im Textmodus empfangen wird. Der obige Code implementiert den Effekt einer Sendung.
Laut der obigen Verarbeitungslogik ist die Integration von WebSocket durch Tomcat nicht zu schwierig. Wenn Sie bei der Bearbeitung einer Anfrage auf eine WebSocket -Protokollanforderung stoßen, werden Sie eine spezielle Verarbeitung durchführen, die Verbindung aufbewahren und die On -Open -On -Open -Message -Methoden von WebSocketServlet zum richtigen Zeitpunkt aufrufen. Da WebSocket im Allgemeinen empfohlen wird, im NIO -Modus verwendet zu werden, schauen Sie sich das WebSocket -Protokoll von NIO -Modus an.
Wie in der Abbildung gezeigt, wenn die Client -Verbindung des Websocket vom Empfänger empfangen und in der Niochannel -Warteschlange registriert wird, ruht die Poller -Komponente immer wieder darauf, ob ein Niochannel zu handhaben ist. In diesem Fall wird die Verarbeitungspipeline zum Servlet durchläuft, das das WebSocketServlet erbt. Mit der DoGet -Methode des WebSocketServlet wird der WebSocket -Handshake verarbeitet und dem Rückgabe -Client mitgeteilt, dass sie sich der Upgrade -Vereinbarung einverstanden machen soll. Später wechselte Poller weiterhin abwechselnd, um den verwandten Niochannel abzunehmen. Sobald festgestellt wurde, dass die Pipeline mit dem WebSocket -Protokoll verwendet wurde, würde sie die MessageInbound -Methode bezeichnen, um die Verarbeitung verschiedener Ereignisse zu vervollständigen und so die Unterstützung für das WebSocket -Protokoll zu erhalten.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!