12

クライアント側で socket.io を使用するには、通常、node.js サーバーを起動して次のようにします。

<script src="/socket.io/socket.io.js"></script>

または特定のポートで:

<script src="http://localhost:3700/socket.io/socket.io.js"></script>

質問は:

socket.io.js を提供するために node.js サーバーを使用する必要がありますか?

...またはそれは可能ですか

socket.io が必要になるたびにサーバーにアクセスする代わりに、socket.io.js のローカル コピーを作成しますか?


たとえば、ソースを表示して、script タグのソースから取得したすべてをコピーします。

それを貼り付けて、socket.io-local.jsとして保存し、次回使用できるようにします。

<script src="socket.io-local.js"></script>

それはうまくいきますか?


アップデート

皆さんの素晴らしい反応に感謝します。

私が関与している場合、実際にはサーバーにアクセスできないため、これを求めています。

Javaで書かれた他の開発者のSocket Severに接続するためのクライアント側を書いています。

したがって、そこにサーバーがないという事実を回避する方法を考える必要があります。

私がテストしてきたことから、この方法は機能しているように見えますが、舞台裏で何が起こっているのか本当にわかりません。

4

3 に答える 3

30

明らかに、socket.io クライアント ライブラリをどこでもホストして、ページに取り込むことができます。ただし、 Java ベースのサーバーではほぼ確実に機能しません。

その理由を理解するには、socket.io が舞台裏で実際に何をしているのかを理解する必要があります。クライアント ライブラリはほんの一部です。

Socket.io は、ブラウザとサーバー間のリアルタイム通信用に独自のプロトコルを実際に定義および実装しています。これは、複数のトランスポートをサポートする方法で行われます。たとえば、ユーザーのブラウザーまたはプロキシがWebSocketsをサポートしていない場合、ロング ポーリングにフォールバックできます。

socket.io クライアントが実際に行うことは次のとおりです。

  1. の XHRGETリクエストを作成し/socket.io/1ます。サーバーは、セッション ID、構成されたタイムアウト、およびサポートされているトランスポートで応答します。
  2. クライアントは、ユーザーのブラウザーがサポートする最適なトランスポートを選択します。最新のブラウザーでは、WebSocket を使用します。
  3. WebSockets がサポートされている場合は、特別な URL へWebSocketの WebSocket 接続 (ヘッダーGET付きHTTP) を開始するために新しい を作成します – .Upgrade: websocket/socket.io/1/websocket/<session id>
  4. WebSocket がブラウザーでサポートされていないか、接続に失敗した場合 (プロキシ、フィルター、ネットワーク セキュリティ デバイスなど、WebSocket 要求をサポートしない仲介者が多数存在します)、ライブラリは XHR long にフォールバックします。ポーリングし、XHR リクエストを に送信し/socket.io/1/xhr-polling/<sesion id>ます。サーバーは、新しいメッセージが利用可能になるかタイムアウトに達するまでリクエストに応答しません。この時点で、クライアントは XHR リクエストを繰り返します。

Socket.io のサーバー コンポーネントは、この混乱のもう一方の端を処理します。の下のすべての URL を処理し、/socket.io/セッションをセットアップし、WebSocket のアップグレードを解析し、実際にメッセージを送信し、その他の簿記を処理します。

socket.io サーバーによって提供されるすべてのサービスがなければ、クライアント ライブラリはほとんど役に立ちません。サーバーに存在しない URL に対して XHR リクエストを行うだけです。

私の推測では、Java ベースのサーバーは WebSockets プロトコルを実装しているだけです。ブラウザが提供する WebSocket APIを使用して直接接続できます。

サーバーが socket.io プロトコルを実装している可能性はありますが、それを行うために放棄された Java プロジェクトがいくつかありますが、その可能性は低いです。サーバーの開発者と話をして、彼が「ソケット サーバー」をどのように実装したかを正確に調べてください。

于 2013-10-22T15:57:02.327 に答える
4

socket.io-client のスタンドアロン ビルドは、socket.io サーバーによって として自動的に公開されます/socket.io/socket.io.jsまたは、このリポジトリsocket.io-client.jsのルートにあるファイルを提供することもできます。

https://github.com/LearnBoost/socket.io-client

実際に socket.io をラップするshotgun-clientというモジュールがあります。カスタム クライアント スクリプトと socket.io クライアント スクリプトを提供する必要がありましたが、モジュールのすべてのユーザーがページに複数のスクリプト参照を含める必要はありませんでした。

インストールすると、ファイル/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.jsを読み取ることで、socket.io から生成されたクライアント スクリプトを提供できることがわかりました。したがって、モジュールは独自の URL のリスナーを追加し、カスタム クライアント スクリプトを提供するときに、socket.io クライアント スクリプトも提供します。ビオラ!私のモジュールのユーザーのための単一のスクリプト参照のみ:)

于 2013-10-22T15:22:21.420 に答える
1

これは技術的には可能ですが、なぜそれを行う必要があるのか​​ わかりません。ネットワークを経由するデータを減らすことを懸念している場合、この変更は実際には、短いsrcタグに保存された数文字を超えることはありません。サーバー上の JS ファイルの場所を変更するだけでは、実際にはパフォーマンスが向上しません。JS を送信する必要があります。

適切なキャッシング (Socket.IO が持つ) は 304 Not Modified を返します (ページをロードするたびに JS ファイルを再送信しません)。

于 2013-10-21T23:53:50.797 に答える