12

クライアントとサーバーの両方がマシン上でローカルに実行されている場合、websocket 接続をセットアップするのに約 1 秒かかるようです。これは私にはかなり長い時間のように思えます - そうですか? これを自分の経験と比較できる人はいますか?


詳細:

クライアント (Chrome 25、Windows7 64) で次のような websocket 要求があります。

this.ws = new WebSocket('ws://' + host + ':' + port);

サーバー側では、ExpressJSを実行している Node と、アップグレードと WS 接続を処理するeinaros/wsがあります。

新作の直前からイベントまで、クライアントに合わせてタイミングを計っていWebSocket()ますws.onopen

4

2 に答える 2

22

この質問に対する明確な答えを見つけました。どうやら、を使用するlocalhostと、ブラウザは最初に接続を試み、1 秒のタイムアウト後にipv6フォールバックします。そもそも使用して接続しようとするのでipv4、使用することで問題は解決します。127.0.0.1ipv4

ソース

于 2013-02-28T19:39:39.783 に答える
1

それは正常ではありません。

次のテスト コードを使用して Ubuntu で Chrome 24 を使用しています (Chrome Dev コンソールを起動して貼り付けるだけです)。

function test_ws(uri){
    start = new Date().getTime(); 
    ws = new WebSocket(uri);
    ws.onopen = function(){
        console.log("onopen of", uri, "in", (new Date().getTime() - start), "ms");
    };
}

uriのさまざまな値に対して得た平均的な結果を次に示します。

  • ws://localhost:6080: 20 ミリ秒 (カスタム python ベースの WebSocket サーバー)
  • ws://localhost:6090: 3 ミリ秒 (カスタム node.js + einaros/ws ベースの WebSocket サーバー)
  • ws://echo.websocket.org:130ミリ秒
  • wss://echo.websocket.org:190ミリ秒

したがって、パブリック リモート Websocket サーバーへの暗号化された接続を使用しても、open イベントまでの平均時間は 5 分の 1 秒未満です。私が見た最大時間は250msでした。ローカル接続の場合、遅延は実際には数ミリ秒にすぎません。

私の推測では、サーバーのセットアップは、接続を受け入れる前に一連の処理を行っていると思われます。おそらく、新しい接続ハンドラで大量のクライアント データを初期化しているのではないでしょうか?

更新

以下は、上記のクライアント テスト コードを使用して 3 ミリ秒の onopen 応答を返す単純な einaros/ws ベースの WebSocket サーバーです。

var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({port: 6090});
wss.on('connection', function(ws) {
    console.log("got connection");
});
于 2013-02-28T15:13:40.510 に答える