質問

まず、私は敵意も怠慢もせず、人々の考えを知りたいだけです。クライアントとサーバーの間の双方向通信を検討しています。クライアントはWebアプリケーションです。この時点で、いくつかのオプションがあります。MS-専門的な二重鎖結合、私が信頼できない不自然で不自然に聞いていることから、彗星とWebソケット(サポートされているブラウザー用)。

この質問はここで他の方法で尋ねられていることを知っていますが、アプローチに対してより具体的な質問があります。 Webソケットがクライアント側であることを考慮すると、クライアントコードはJavaScriptにあります。 JavaScriptで直接アプリケーションの大部分を構築することは本当に意図ですか?なぜW3CはWebサービスでこれをしなかったのですか? SOAPを使用して契約を提供し、関係する既存のメッセージとともにイベントを定義できるのは簡単ではないでしょうか?これまでのところ、スティックの短い端のように感じます。

シンプルにして、JSダイナミックな性質を活用して、それが属するコードの大部分を残してみませんか....サーバー上に?

それ以外の

mysocket.send("AFunction|withparameters|segmented");

私たちは言うことができます

myServerObject.AFunction("that", "makessense");

の代わりに

...
mysocket.onmessage = function() { alert("yay! an ambiguous message"); }
...

私たちは言うことができます

...
myServerObject.MeaningfulEvent = function(realData) { alert("Since I have realistic data....");  alert("Hello " + realData.FullName); }
...

HTML 5は永遠に定着しました....私たちは間違った方向に多大な努力を無駄にしましたか?考え?

役に立ちましたか?

解決

WebSocketsの周りの概念をまだ完全に把握していないように、私には聞こえます。たとえば、あなたは言う:

Webソケットを考慮して、クライアント側です

これはそうではありません、ソケットには2つの側面があります。これらをサーバーとクライアントと考えることができますが、接続が確立されると区別がぼやけます。クライアントとサーバーを「ピア」と考えることもできます。いつでも接続するパイプ(ソケット接続)に書き込みまたは読み込むことができます。 TCPの上でHTTPの作品についてもう少し学ぶことからもう少し恩恵を受けると思います。この方法では、httpに似ている /類似しています。

SOAP / WSDLに関しては、TCP / WebSocket / HTTPを取り巻く会話の観点から、すべてのSOAP / WSDLの会話をHTTP(つまり通常のWebページトラフィック)と同一であると考えることができます。

最後に、ネットワークプログラミングの積み重ねられた性質を覚えておいてください。たとえば、SOAP/WSDLは次のようになります。

SOAP/WSDL
--------- (sits atop)
HTTP
--------- (sits atop)
TCP

そして、WebSocketsはこのように見えます

WebSocket
--------- (sits atop)
TCP

Hth。

他のヒント

JavaScriptを使用すると、クライアントはXMLHTTPRequestを使用してHTTPを介して通信できます。 WebSocketsはこの機能を拡張して、JavaScriptが任意のネットワークI/O(HTTPだけでなく)を作成できるようにします。これは、論理的拡張機能であり、TCPトラフィックを使用する必要があるあらゆる種類のアプリケーション(ただし、HTTPプロトコルを使用していない可能性がある)を可能にします。 JavaScriptに。アプリケーションがクラウドに移行し続けるにつれて、HTMLとJavaScriptがデスクトップで利用可能なすべてをサポートすることはかなり論理的だと思います。

サーバーは、JavaScriptクライアントに代わって非HTTPネットワークI/Oを実行し、その通信をHTTPで利用できるようにすることができますが、これは常に最も適切または効率的なことではありません。たとえば、オンラインSSH端末を作成しようとする際に、追加の往復コストを追加することは意味がありません。 WebSocketsを使用すると、JavaScriptはSSHサーバーに直接通信できるようになります。

構文に関しては、その一部はxmlhttprequestに基づいています。他の投稿で指摘されているように、WebSocketsはかなり低レベルのAPIであり、より理解しやすいものに包むことができます。 WebSocketsが最もエレガントな構文を持っていることよりも、必要なすべてのアプリケーションをサポートすることが重要です(構文に焦点を合わせると、より制限的な機能につながる場合があります)。ライブラリの著者は、この非常に一般的なAPIを他のアプリケーション開発者により管理しやすくすることができます。

あなたが指摘したように、WebSocketsは持っています 低いオーバーヘッド. 。オーバーヘッドは、通常のTCPソケットに似ています。Ajax/Cometの数百と比較して、フレームごとに2バイトだけです。

何らかの組み込みのRPC機能の代わりに低レベルなのはなぜですか?いくつかの考え:

  • 既存のRPCプロトコルを採用するのはそれほど難しくありません それを重ねます 低レベルのソケットプロトコル。 RPCオーバーヘッドが想定されている場合、反対方向に進んで低レベルの接続を構築することはできません。

  • WebSocketsのサポートはです かなり些細な サーバー側の複数の言語に追加します。ペイロードはUTF-8文字列であり、ほとんどすべての言語には、そのための効率的なサポートが組み込まれています。 RPCメカニズムはそれほど多くありません。 JavaScriptとターゲット言語間のデータ型変換をどのように処理しますか? JavaScript側にタイプヒントを追加する必要がありますか?可変長さの引数や引数リストはどうですか?言語に良い答えがない場合、これらのメカニズムを構築しますか?等。

  • どのRPCメカニズムが後にモデル化されますか?既存のもの(SOAP、XML-RPC、JSON-RPC、Java RMI、AMF、RPYC、Corba)またはまったく新しいものを選択しますか?

  • クライアントのサポートがかなり普遍的になると、通常のTCPソケットを持つ多くのサービスがWebSocketsのサポートを追加します(追加するのはかなり些細なことです)。 WebSocketsがRPCベースであった場合、同じことは当てはまりません。一部の既存のサービスはRPCレイヤーを追加する場合がありますが、ほとんどの場合、WebSocketsサービスはゼロから作成されます。

私のために novnc Project(JavaScript、Canvas、WebSocketsのみを使用するVNCクライアント)WebSocketの低いオーバーヘッドの性質は、合理的なパフォーマンスを達成するために重要です。 VNCサーバーにWebSocketsサポートが含まれるまで、NOVNCにはTCPソケットプロキシへの一般的なWebSocketであるWsproxyが含まれます。

インタラクティブなWebアプリケーションの実装を考えていて、サーバー側の言語を決定していない場合は、 socket.io これは図書館です ノード (GoogleのV8エンジンを使用したサーバー側JavaScript)。

ノードのすべての利点(両側の同じ言語、非常に効率的、電力ライブラリなど)に加えて、socket.ioはいくつかのことを提供します。

  • 接続を処理するためのクライアントとサーバーのフレームワークライブラリの両方を提供します。

  • クライアントとサーバーの両方でサポートされている最高のトランスポートを検出します。トランスポートには、(ベストから最悪へ):ネイティブWebSocket、フラッシュエミュレーションを使用したWebSocket、さまざまなAJAXモデルが含まれます。

  • どの輸送が使用されていても、一貫したインターフェイス。

  • JavaScriptデータ型の自動エンコード/デコード。

両側は同じネイティブタイプの同じ言語であるため、socket.ioの上にRPCメカニズムを作成するのはそれほど難しくありません。

WebSocketは、リクエストがサーバーから発信されるようにすることにより、Cometおよびその他のすべてのHTTPプッシュタイプのテクニックを読みやすくします。サンドボックスソケットのようなもので、機能が限られています。

ただし、APIは、フレームワークとライブラリの著者が、どんな方法でもインターフェイスを改善するのに十分な一般的です。たとえば、WebSocketsの上にRPCまたはRMIスタイルのサービスを書くことができ、ワイヤー上にオブジェクトを送信できます。現在、内部的には、いくつかの未知の形式でシリアル化されていますが、サービスユーザーは知る必要がなく、気にしません。

スペックの著者からのPOVから考えて、

mysocket.send("AFunction|withparameters|segmented");

myServerObject.AFunction("that", "makessense");

比較的簡単で、ウェブケットの周りに小さなラッパーを書く必要があります。そうすれば、シリアル化と敏arialializationがアプリケーションに不透明に行われるようにします。しかし、逆方向に進むことは、仕様著者がより複雑なAPIを作成する必要があることを意味します。これにより、コードを書くための基盤が弱くなります。

私はようなことをする必要があるのと同じ問題に遭遇しました call('AFunction', 'foo', 'bar') すべての相互作用をシリアル化/シリアル化するのではなく。私の好みは、サーバー上にコードの大部分を残し、JavaScriptを使用してビューを処理することも好みました。双方向のコミュニケーションに対する自然なサポートのため、WebSocketsはより適していました。アプリの開発を簡素化するために、WebSocketsの上にレイヤーを構築して、リモートメソッド呼び出しを作成します( RPC).

私は公開しました RMI/RPC 図書館 http://sourceforge.net/projects/rmiwebsocket/. 。 Webページとサーブレットの間に通信がセットアップされたら、どちらの方向にも呼び出しを実行できます。サーバーは反射を使用してサーバー側のオブジェクトで適切なメソッドを呼び出し、クライアントはJavaScriptの「呼び出し」メソッドを使用して、クライアント側オブジェクトの適切な関数を呼び出します。ライブラリは使用します ジャクソン JSONとの間、さまざまなJavaタイプのシリアル化/脱登りに対処するため。

WebSocket JSRは、多くの当事者(Oracle、Apache、Eclipseなど)によって交渉されました。それも同様に、彼らがメッセージトランスポートレベルで停止し、より高いレベルの構造を残しています。必要なものがJavaScript RMIへのJavaである場合は、 フェルミフレームワーク.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top