TomcatにWebSocketを実装する方法
WebSocketプロトコルはHTML5標準に属し、ますます多くのブラウザがWebSocketをネイティブにサポートしているため、クライアントとサーバーが双方向通信を実現できます。クライアントとサーバーの間にWebSocket接続を確立した後、サーバー側のメッセージをクライアントに直接送信して、従来のリクエスト応答モードを破り、無意味なリクエストを回避できます。たとえば、従来の方法ではAjaxを使用してサーバー側を継続的に要求する場合がありますが、WebSocketはクライアントに直接データを送信でき、クライアントはそれを要求する必要がありません。同時に、ネイティブブラウザのサポートのおかげで、クライアントアプリケーションの作成がより便利になり、サードパーティのプラグインに依存する必要はありません。さらに、WebSocketプロトコルはHTTPプロトコルの面倒なリクエストヘッダーを放棄しますが、より効率的なデータフレームの形で送信します。
写真は、WebSocketプロトコル通信のプロセスを示しています。まず、クライアントはハンドシェイクパッケージを送信して、ウェブソケットにアップグレードしたいことをサーバーに伝えます。あなたのサーバーが同意するかどうかはわかりません。この時点で、サーバーがWebSocketプロトコルをサポートしている場合、ハンドシェイクパッケージを返して、問題がなく、アップグレードが確認されていることをクライアントに伝えます。次に、WebSocket Connectionが正常に確立され、双方向通信をサポートし、WebSocketプロトコルのデータフレーム形式を使用してメッセージを送信します。
握手プロセスを説明する必要があります。 WebSocketプロトコルを既存のHTTPプロトコルWebアーキテクチャと互換性のあるものにするために、WebSocketプロトコルのハンドシェイクはHTTPプロトコルに基づいている必要があります。たとえば、クライアントは、以下と同様のHTTPメッセージをサーバーリクエストに送信して、Websocketプロトコルにアップグレードします。アップグレード:WebSocketは、プロトコルをアップグレードしたいことをサーバーに伝えます。
ws:// localhost:8080/hello http/1.1 origin:http:// localhost:8080 connection:connection:upgrade host:localhost:localhost:8080 sec-websocket-key:urovsczjnol/umbtt5ukmw == upgrade:websocket sec-websocket-:13
この時点で、サーバーがWebSocketプロトコルをサポートしている場合、クライアントのアップグレードプロトコルに一致するメッセージが送信されます。特定のメッセージは、アップグレード:WebSocketがクライアントに、アップグレードプロトコルに同意することをクライアントに伝えます。
HTTP/1.1 101 WebSocketプロトコルハンドシェイク日付:2016年2月10日金曜日17:38:18 GMT接続:アップグレードサーバー:Kaazing Gateway Upgrade:WebSocket Sec-Websocket-Accept:RLHCKW/SKSO9GAH/ZSFHBATDKRU =
上記のように握手を完了した後、HTTPプロトコル接続が壊れています。次に、WebSocketプロトコルを使用して、2つの関係者間で通信します。この接続はまだ元のTCP/IP接続であり、ポートはまだ元の80または443です。
TomcatでWebSocketを作成する簡単な例を次に示します。
パブリッククラスのHelloweBsocketservletは、websocketservlet {private static list <messageinbound> socketlist = new arrayList <messageInbound>();保護されたStreaminbound CreateWeBsocketInbound(String SubprotoCol、HTTPSERVLETREQUESTリクエスト){return new WebSocketMessageInBound(); } public class webSocketMessageInbound extends messageinbound {protected void onclose(int status){super.onclose(status); socketlist.remove(this); }保護されたvoid onopen(wsoutbound outbound){super.onopen(outbound); socketlist.add(this); } @Override保護されたvoid onbinarymessage(bytebuffer message)ioexception {} @override保護されたvoid ontextmessage(charbuffer message)throws ioexception {for(socketlund:socketlist){charbuffer buffer = charbuffer.wrap(mashe); wsoutbound outbound = messageinbound.getwsoutbound(); outbound.writeTextmessage(バッファー); outbound.flush(); }}}}このサーブレットは、WebSocketServletを継承し、MessageInboundを継承するWebSocketMessageInboundクラスを作成する必要があります。このクラスにオンクロース、Onopen、OnbinaryMessage、OntextMessageをこのクラスに入力して、各イベントのロジックを完了します。 Onopenは、WebSocket接続が確立されたときに呼び出され、WebSocketが閉じられたときにOnCloseが呼び出され、クライアントデータがバイナリモードで受信されたときにOnBinaryMessageが呼び出され、クライアントデータがテキストモードで受信されるとONTExtMessageが呼び出されます。上記のコードは、放送の効果を実装しています。
上記の処理ロジックによると、TomcatのWebSocketの統合はそれほど難しくありません。つまり、リクエストの処理時にWebSocketプロトコル要求に遭遇した場合、特別な処理を行い、接続を維持し、OnClose、OnbinaryMessage、およびOntextMessageを適切な時間に呼び出します。 WebSocketは一般にNIOモードで使用することをお勧めします。NIOモード統合WebSocketプロトコルをご覧ください。
図に示すように、WebSocketのクライアント接続が受信機によって受信され、NioChannelキューに登録されている場合、ポーラーコンポーネントは、処理するニオチャネルがあるかどうかにかかっています。もしそうなら、それはWebSockEtservletを継承するサーブレットへの処理パイプラインを通過します。 WebSocketServletのDoGetメソッドは、WebSocketの握手を処理し、Return Clientにアップグレード契約に同意するよう指示します。その後、Pollerは、関連するNiochannelを離陸させるために交代を続けました。 Websocketプロトコルを使用したパイプラインが使用されたことが発見されると、MessageInboundメソッドを呼び出してさまざまなイベントの処理を完了し、Websocketプロトコルのサポートを達成します。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!