インターネットの開発により、従来の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の実装を導入し、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.27以上でも実行する必要があります。
WebSocketサーバーコード
//この注釈は、クライアントがWebSocketに接続できるURIを指定するために使用されます。サーブレットのような注釈マッピング。 web.xmlで構成する必要はありません。 @serverendpoint( "/websocket")パブリッククラスWebSocketDemo {//現在のオンライン接続の記録に使用される静的変数。スレッドセーフになるように設計する必要があります。 Private static final Atomicinteger onlinecount = new AtomicInteger(0); //同時パッケージのスレッドセーフセットを使用して、各クライアントの対応するMyWeBsocketオブジェクトを保存します。サーバーが単一のクライアントと通信することを認識するには、Mapを使用してそれを保存できます。キーはユーザープライベートcopyonwritearrayset <websocketdemo> websocketdemo> websocketetetset = new copyonwritearrayset <websocketdemo>()を識別できます。 //クライアントプライベートファイナルストリングニックネームを記録するチャットニックネームを定義します。 //接続セッションを特定のクライアントと接続すると、クライアントプライベートセッションセッションにデータを送信する必要があります。 public websocketdemo(){nickname = "guest" + onlinecount.getandincrement(); } / * * @onopenアノテーションを使用して、クライアントリンクが成功した後のリターンを示します。パラメーターセッションはオプションのパラメーターですこのセッションは、セッションを表すWebsocket仕様のセッションです。 httpsession */ @onopen public void onopen(セッションセッション){this.session = session; websocketset.add(this); string message = string.format( "[%s、%s]"、nickname、 "チャットルームへの追加");ブロードキャスト(メッセージ); system.out.println( "onopen"); }/ * * @onmessageアノテーションを使用して、クライアントがメッセージを送信する時期を示し、最初のパラメーターはユーザーが送信したデータを示します。パラメーターセッションはオプションのパラメーターであり、Onopenメソッド */@onmessage public void onmessage(Stringメッセージ、セッションセッション)のセッションと一致しています。 broadcast(string.format( "%s:%s"、nickname、filter(message))); }/ **コールバックユーザーがリンクを破った後、クライアントが壊れたリンクメソッドを呼び出した後にこのメソッドを呼び出す必要があることに注意してください。 string message = string.format( "[%s、%s]"、nickname、 "leaves the Chat Room link");ブロードキャスト(メッセージ); } //完全な質量送信プライベートボイドブロードキャスト(String Info){for(websocketdemo W:websocketset){try {synchronized(websocketdemo.class){w.session.getBasicRemote()。sendtext(info); }} catch(ioException e){system.out.println( "メッセージをクライアントに送信"+w.nickname+"メッセージの送信に失敗しました"); websocketset.remove(w); try {w.session.close(); } catch(ioexception e1){} string message = string.format( "[%s、%s]"、w.nickname、 "disconnected");ブロードキャスト(メッセージ); }}} //キーワードなどのブロックなど、ユーザーメッセージのフィルタリング要求をいくつか作成できます。 。 public static String Filter(String Message){if(message == null){return null; }メッセージを返します。 }}クライアント(Webホームページ)コード:
<!doctype html> <html> <head> <meta charset = "utf-8"> <title>ここに挿入</title> <スクリプトタイプ= "text/javascript"> var ws = new websocket( "ws:// localhost:8080/websockettest/websocket"); / * * 3つの状態の変更を聞きます。 jsはコールバック*/ ws.onopen = function(message){}; ws.onclose = function(message){}; ws.onmessage = function(message){showmessage(message.data); }; //ウィンドウクロージングイベントを聞いてください。ウィンドウが閉じたら、接続が切断される前にウィンドウが閉じないようにWebSocket接続を積極的に閉じ、サーバー側が例外をスローします。 window.onbeforeunload = function(){ws.close(); }; //接続関数を閉じるclosewebsocket(){ws.close(); } //メッセージfunction send(){var input = document.getElementById( "msg"); var text = input.Value; ws.send(テキスト); input.value = ""; } function showmessage(message){var text = document.createTextNode(message); var br = document.createelement( "br")var div = document.getElementById( "showchatmessage"); Div.AppendChild(テキスト); Div.AppendChild(BR); } </script> </head> <body> <div id = "show"> <div id = "showchatmessage"> </div> <入力タイプ= "text" size = "80" id = "msg" name = "msg" placehorder = "enter chat content"/> <input type = "button" value = "" sendbn "" sendbn "" sendbn "" sendbn "" sendbn "" sendbn " onclick = "send()"> </body> </html>上記のように、グループチャット機能を備えたチャットルームが完了しました。検証プロセス中に、WebSocketを使用するとクロスドメイン要求を完了できることがわかりました。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。