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.1因为它首先会尝试使用连接ipv4

资源

于 2013-02-28T19:39:39.783 回答
1

这是不正常的。

我在 Ubuntu 上使用 Chrome 24 并带有以下测试代码(只需启动 Chrome 开发控制台并将其粘贴):

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 ms (自定义 node.js + einaros/ws 基于 WebSocket 服务器)
  • ws://echo.websocket.org: 130 毫秒
  • wss://echo.websocket.org: 190 毫秒

因此,即使使用与公共远程 Websocket 服务器的加密连接,在打开事件之前平均仍不到五分之一秒。我看到的最长时间是250毫秒。对于本地连接,延迟实际上应该只有几毫秒。

我的猜测是您的服务器设置在接受连接之前正在进行大量处理。也许您正在新的连接处理程序中初始化一堆客户端数据?

更新

这是一个简单的基于 einaros/ws 的 WebSocket 服务器,它使用上面的客户端测试代码提供 3 毫秒的 onopen 响应:

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 回答