WebSocket:未来はここにあります!

今日は、WebSocketテクノロジー、その外観の前提条件、現在の問題とその解決策について簡単に説明します。



背景



HTTPプロトコルが設計されて以来、大量の水が流れ、Javascriptが背景の雪片の落下にのみ使用されていた時代が過ぎました。 すぐにサーバーとの追加のデータ交換が必要になりました。そのため、AJAXを考え出しました(最初にiframeタグとscriptタグを使用し、次にXMLHttpRequestを考え出しました)。 ただし、これらのメソッドはすべて、クライアントがデータ転送を開始する必要があることを意味します。 もちろん、誰もが無限にダウンロード可能なフレームでチャットすることを知っていますが、これらは単なる松葉杖であり、開発で使用されたツールの不完全さにより、サーバーに大きな負荷をかけました。 各ユーザーは、サーバー上のプロセスを自分で食べました。

ブラウザ開発者のセキュリティ対策が強制されているため、iframeとXMLHttpRequestでは、現在のドキュメントのドメイン以外のドメインとのデータ交換を許可していません。 履歴を使用してドキュメント間でデータストリームを形成するハックタイプXhrIframeProxyがあります。 しかし、これはすべて白い糸で縫われています。

かなり良いオプションは、ロングポーリングです。これは、ブラウザがシーケンシャルリクエストを送信し、各リクエストがデータパケットを受信するまでハングする方法です。 ただし、印象的な欠点は、トラフィックと接続数のオーバーヘッドが大きいことです。

これらの方法の主な欠点は、最終的な開発の複雑さと俊敏性です。これは、有用なロジックと低レベルの麺の混乱です。 したがって、複雑な知識がなければ、サーバーによって開始されたデータ転送を実装することはできません。



だった?



そして、2009年が到着した4月23日です。 「Web Sockets API」と呼ばれる文書の下書きが登場し、すべての病気の終わりの始まりを示しました。 Javascriptからアクセス可能なオブジェクトについて説明しました。このオブジェクトには次の機能があります。

-オリジンベースのクロスドメインポリシー(Orginベースのセキュリティポリシー)-つまり、任意のページから任意のサーバーに接続でき、彼はOrgin(ドキュメントアドレス)に基づいてこの幸福が必要かどうかを決定します。

-トラフィックのオーバーヘッドが少ない。

-1つの接続を使用して両方向にデータを転送する機能

-現時点では、ネイティブにサポートされているのはGoogle Chrome 4+安定版とSafari 5、Mozilla Firefox 3.7およびIE 9でのみです。



すべてのブラウザをサポートするための代替手段はありますか?



オプション:



1. Flashエミュレーター(http://github.com/gimite/web-socket-js)

短所:UGコード、誰もがフラッシュを持っているわけではなく、フラッシュブロックプラグインを持っているものもあります。



2. iframe(iframeの無限のロード)とロングポーリング(wait-re-request、....)を使用します。

短所:アプリケーションレベルで3つの異なるトランスポートを実装し、プロセス間通信を確立することは非常に重要なタスクです。



チップとデールは救助に急ぎます



状況について考えた後、次の要件を満たすフレームワークが必要であると判断しました。

-サーバーとクライアントの両方の異なるトランスポート(ネイティブWebソケット、フラッシュWebソケット、コメット、ロングポーリング)からのA​​PIの抽象化。

-非同期:サーバー上の1つのプロセスが複数のクライアント接続を同時にサポートする必要があります。

-Javascriptクライアントは、ブラウザ、Flashの存在、ユーザー接続のタイプ(直接、プロキシなど)に自動的に適応する必要があります。



それは夕方でした、何もすることはありませんでした。

何が起こったのかの例はhttp://loopback.su/websocket/です (あなたが私を責めない場合、彼女は家のテーブルの下に立っています)。

サーバーアプリケーションはこちらです。

IE 6までのすべてのブラウザーで動作します。サーバー実装-phpDaemonのモジュール。 すべて一緒にgithubでプルできます。

このアプローチの主な利点は、クライアントサーバーアプリケーションを記述するときに、ブラウザがどのようなクライアントであるかを考える必要がなく、誰もがネイティブのWebSocketを持っているかのように書くことです。

必要に応じて、サーバー部分を他のプログラミング言語に書き換えることもできます。



All Articles