1. WebSocketの簡単な紹介
WebSocketプロトコルは、HTML5の新しいプロトコルです。ブラウザとサーバーの間のフルダプレックス通信を実装します。最初の握手には、握手を完了するためにHTTPリクエストの助けが必要です。
インターネットの開発により、従来のHTTPプロトコルは、Webアプリケーションのますます複雑なニーズを満たすことが困難でした。近年、HTML5の誕生により、WebSocketプロトコルが提案されています。ブラウザとサーバー間のフルダップレックス通信を実現し、ブラウザとサーバー間の通信機能を拡張し、サーバーがクライアントに積極的にデータを送信できるようにします。
WebSocketの背景
ブラウザのHTTPを通じて、片道通信のみを実現できます。 Cometは双方向通信をある程度シミュレートできますが、効率が低く、サーバーからの適切なサポートが必要です。 SocketとXmlSocket in Flashは、真の双方向通信を実現でき、これら2つの機能はFlex Ajax Bridgeを介してJavaScriptで使用できます。 WebSocketがブラウザに実装されている場合、上記の2つのテクノロジーを置き換えて広く使用されることが予見可能です。この状況に直面して、HTML5はWebSocketプロトコルを定義します。これにより、サーバーリソースと帯域幅をより適切に節約し、リアルタイム通信を実現できます。
WebSocketプロトコルはJavaee7にも実装されています。
従来の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以内に展開する必要があります。
2。WebSocketの例
2.1。新しいJavawebテストプロジェクトを作成します
pom.xmlにJARパッケージの依存関係を追加します
<Dependency> <GroupId> Javax </groupId> <artifactid> javaee-api </artifactid> <version>。</version> <scope>
クライアント(Webホームページ)コード:
<%@ page Language = "Java" PageEncoding = "utf-"%> <!doctype html> <html> <head> <head> <title> Java Backend WebsocketのTomcat実装</ittitle> </head> <body> welcome <br/> <input id = "text" type "type" tex onclick = "closewebsocket()"> close websocket connection </button> <hr/> <div id = "message"> </div> </body> <script = "text/javascript"> var websocket = null; //現在のブラウザがWebsocketif( 'websocket'){websocket: {alert( '現在のブラウザはWebSocketをサポートしていない')} //接続のエラーのコールバックメソッドwebsocket.onerror = function(){setMessageInnerhtml( "websocket接続エラー");}; websocket.onmessage = function(event){setMessageInnerhtml(event.data);} //接続クローズドコールバックメソッドwebsocket.onclose = function(){setmessageinnerhtml( "websocket connection closht");} //ウィンドウ閉じたイベントを聞きます。ウィンドウが閉じたら、接続が切断される前にウィンドウが閉じないようにWebSocket接続を積極的に閉じ、サーバー側が例外をスローします。 window.onbeforunload = function(){closewebsocket();} // Webページにメッセージを表示しますsetmessageinnerhtml(innerhtml){document.getelementbyid( 'message')。 send(){var message = document.getElementById( 'text')。value; websocket.send(message);} </script> </html> Java Webバックエンドコード
packy me.gacl.websocket; Import java.io.ioexception; Import java.util.copyonwritearrayset; Import javax.websocket。*; import javax.websocket.server.serverendpoint;その機能は、主に現在のクラスをWebsocketサーバー側として定義することです。注釈の値は、ユーザーの端末アクセスのURLアドレスへのユーザーの接続を聞くために使用されます。クライアントは、このURL*/@serverEndpoint( "/websocket")パブリッククラスWebSockettest {//現在のオンライン接続の記録に使用される静的変数を介してWebSocketサーバー側に接続できます。スレッドセーフになるように設計する必要があります。 private static int onlinecount =; //同時パッケージのスレッドセーフセットを使用して、各クライアントの対応するmywebsocketオブジェクトを保存します。サーバーが単一のクライアントと通信することを認識するには、マップを使用してそれを保存できます。キーはユーザープライベートcopyonwritearrayset <websockettest> websockettest = new copyonwritearrayset <websockettest>();セッションは特定のクライアントとの接続セッションであり、それを介してクライアントにデータを送信する必要があります*/@onopenpublic void onopen(セッションセッション){this.session = session; websocketset.add(this); // setのaddonlinecount()に追加します。 // system.out.printlnに追加する( "参加する新しい接続があります!オンラインの現在の人数は" + getonlinecount());}/*** callを接続するためのメソッド*/@onclosepublic void onclose(){websocketset.remove(this); // SETからSubonlineCount()を削除します。 //オンライン番号System.out.Printlnの減少(「接続が閉じている!オンラインの現在の人数は「 + getOnlineCount())メッセージ); //(websockettest item:websockettest){try {item.sendmessage(message);} catch(ioexception e){e.printstacktrace(); continue;}}/***エラーが発生したときに呼び出される* @paramセッション* @paramエラー*/ @onerrorpublic void onerror(shisesable( error){system.out.println( "errorが発生した"); error.printstacktrace();}/***この方法は上記の方法とは異なります。注釈はありません。これは、ニーズに応じて追加された方法です。 * @param message* @throws ioexception*/public void sendmessage(string message)throws ioexception {this.session.getBasicRemote()。 addonlinecount(){websockettest.onlinecount ++;} public static synchronized void subonlinecount(){websockettest.onlinecount-;}}} 1.2。操作効果
マルチクライアントシミュレーションテストのために、GoogleブラウザとFirefoxブラウザーを同時に開きます。操作効果は次のとおりです。
上記のコンテンツは、Java Backend Tomcatが紹介したWebSocketを実装するための例のチュートリアルです。私はそれが誰にでも役立つことを願っています!