1. WebSocketの簡単な紹介
インターネットの開発により、従来のHTTPプロトコルは、Webアプリケーションのますます複雑なニーズを満たすことが困難でした。近年、HTML5の誕生により、WebSocketプロトコルが提案されています。ブラウザとサーバー間のフルダップレックス通信を実現し、ブラウザとサーバー間の通信機能を拡張し、サーバーがクライアントに積極的にデータを送信できるようにします。
従来のHTTPプロトコルはステートレスであることがわかっています。各リクエストは、クライアント(ブラウザなど)が開始する必要があります。処理後、サーバーは応答結果を返します。サーバーがクライアントに積極的にデータを送信することは困難です。この種のクライアントはアクティブパーティーであり、サーバーはパッシブパーティです。従来のWebモデルは、まれな情報変更を伴うWebアプリケーションのトラブルが少なくなりますが、インスタント通信、リアルタイムデータ、サブスクリプションプッシュなどの機能を備えたアプリケーションなどのリアルタイム情報を含むWebアプリケーションに大きな不便をもたらします。ウェブソケット仕様が提案される前に、開発者はこれらの非常にリアルタイムの作業を実装するためにトレードオフソリューションを使用します。実際、後者は本質的に一種のポーリングですが、改善されています。
ポーリングは、リアルタイムのWebアプリケーションを実装するための最も独創的なソリューションです。ポーリングテクノロジーでは、クライアントは定期的に設定された時間間隔でリクエストをサーバーに送信し、新しいデータ変更があるかどうかを頻繁に照会する必要があります。明らかに、このアプローチは、トラフィックとサーバーのリソースを無駄にする不必要な要求が多すぎる可能性があります。
彗星技術は、長いポーリングとストリーミングテクノロジーに分けることができます。長い投票は、上記のポーリング技術を改善し、役に立たない要求を減らします。特定のデータの有効期限を設定し、データの有効期限が切れた後にのみリクエストをサーバーに送信します。このメカニズムは、データの変更が特に頻繁ではない状況に適しています。ストリーミングテクノロジーとは、通常、隠しウィンドウを使用して、サーバーとのHTTPの長い接続を確立するクライアントを指します。サーバーは、接続ステータスを常に更新して、HTTP Long Connectionを生かし続けます。このようにして、サーバーはこの長い接続を通じてクライアントに積極的にデータを送信できます。ストリーミングテクノロジーは、大規模な並行性環境でサーバーのパフォーマンスをテストする場合があります。
両方のテクノロジーは、リクエスト応答モードに基づいており、真の意味でのリアルタイムテクノロジーとは見なされません。それらの廃棄物の各要求または応答は、同じヘッダー情報の一定量のトラフィックを使用しており、開発の複雑さも高くなっています。
HTML5の発売により、WebSocketはWebのリアルタイム通信を本当に実現し、B/SモードにC/Sモードのリアルタイム通信機能を備えています。 WebSocketのワークフローは次のとおりです。ブラウザは、JavaScriptを介してWebSocket接続を確立するためにサーバーにリクエストを送信します。 WebSocket接続が正常に確立された後、クライアントとサーバーはTCP接続を介してデータを送信できます。 WebSocket接続は本質的にTCP接続であるため、各送信で繰り返されるヘッダーデータを運ぶ必要はないため、データ送信量はポーリングや彗星のテクノロジーよりもはるかに小さくなります。この記事では、Websocket仕様を詳細に紹介するものではありませんが、主にJava WebでのWebSocketの実装を紹介しています。
Javaee 7は、WebSocket仕様用にJSR-356:Java APIを作成しました。 Tomcat、Nginx、Jettyなどの多くのWebコンテナは、WebSocketをサポートしています。 Tomcatは、7.0.27およびJSR-356以降7.0.47以降WebSocketをサポートしています。実行するには、次のデモコードもtomcat7.0.47以内に展開する必要があります。
クライアント(Webホームページ)コード:
<%@ page Language = "Java" PageEncoding = "UTF-8"%> < onclick = "closewebsocket()"> close websocket connection </button> <hr/> <div id = "message"> </div> </body> <script = "text/javascript"> var websocket = null; //現在のブラウザがWebSocketをサポートしているかどうかを判断します(ウィンドウの「WebSocket」){webSocket = new WebSocket( "ws://172.16.98.31:8080/websocket/websocket"); } else {alert( '現在のブラウザはWebSocketをサポートしていない'); } //接続のエラーのコールバックメソッドwebsocket.onerror = function(){setMessageInnerhtml( "Error in WebSocket Connection"); }; //接続を成功させるためのコールバック方法} //メッセージWebSocket.Onmessage = function(event)を受信するコールバック方法{setMessageInnerhtml(event.data); } //接続のコールバックメソッドclosit websocket.onclose = function(){setMessageInnerhtml( "WebSocket Connection Closed"); } //ウィンドウクロージングイベントを聞いてください。ウィンドウが閉じたら、接続が切断される前にウィンドウが閉じないようにWebSocket接続を積極的に閉じ、サーバー側が例外をスローします。 window.onbeforeunload = function(){closewebsocket(); } // Webページにメッセージを表示しますsetmessageinnerhtml(innerhtml){document.getElementById( 'message')。innerhtml + = innerhtml + '<br/>'; } // close websocket接続関数closewebsocket(){websocket.close(); } //送信メッセージ関数send(){var message = document.getElementById( 'text')。value; websocket.send(メッセージ); } </script> </html> Java Webバックエンドコード
パッケージcn.com; import java.io.ioexception; Import java.util.concurrent.copyonwritearrayset; Import javax.websocket。*; import javax.websocket.serverendpoint;その機能は、主に現在のクラスをWebsocketサーバー側として定義することです。 *注釈値は、ターミナルアクセスURLアドレスへのユーザーの接続を聞くために使用されます。クライアントは、このURL*を介してWebSocketサーバー側に接続できます。リクエストが作成されるたびに、インスタンスが作成されます。スレッドセーフになるように設計する必要があります。 private static int onlinecount = 0; //同時パッケージのスレッドセーフセットを使用して、各クライアントの対応するMyWeBsocketオブジェクトを保存します。サーバーが単一のクライアントと通信することを認識するには、Mapを使用してそれを保存できます。キーはユーザーのstatic copyonwritearrayset <websockettest> websocketetset = new copyonwritearrayset <websockettest>()を識別できます。 //特定のクライアントとの接続セッションは、プライベートセッションセッションを通じてクライアントにデータを送信する必要があります。 /***接続確立を正常に呼び出す方法* @paramセッションオプションパラメーター。セッションはクライアントとの接続セッションであり、それを介してクライアントにデータを送信する必要があります*/ @onopen public void onopen(セッションセッション){this.session = session; websocketset.add(this); // setのaddonlinecount()に追加します。 // 1つのオンライン番号System.out.println( "参加する新しい接続があります!現在のオンライン人の数は" + getonlinecount()です。 } / ***閉じる呼び出しを接続するメソッド* / @onclose public void onclose(){websocketset.remove(this); // SETからSubonlineCount()を削除します。 //オンライン番号を1つのオンライン番号System.out.println( "閉じた接続があります!オンラインの現在の人数は" + getonlinecount()); } / ***クライアントメッセージを受信した後に呼び出されるメソッド* @paramメッセージクライアントから送信されたメッセージ* @paramセッションオプションパラメーター* / @onmessage public void onmessage(string message、session session){system.out.println( "クライアントからのメッセージ:" +メッセージ); //(websockettest item:websocketetset)のバッチメッセージ{try {item.sendmessage(message); } catch(ioexception e){e.printstacktrace();続く; }}}}} / ** *エラーが発生したときに呼び出されます * @param Session * @paramエラー * / @onerror public void onerror(セッションセッション、スロー可能なエラー){system.out.println( "エラーが発生しました"); error.printstacktrace(); } /***この方法は上記の方法とは異なります。注釈はありません。これは、ニーズに応じて追加された方法です。 * @param message * @throws ioexception */ public void sendmessage(string message)throws ioexception {this.session.getBasicRemote()。sendtext(message); //this.session.getasyncremote().sendtext(message); } public static同期int getonlinecount(){return onlinecount; } public static同期void addonlinecount(){websockettest.onlinecount ++; } public static同期void subonlinecount(){websockettest.onlinecount--; }}2つのブラウザを開き、URLを入力して、直接実行します
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。