Socket.io: 为什么 socket.io 使用 websocket 连接和 xhr 并行轮询?

创建于 2012-08-12  ·  45评论  ·  资料来源: socketio/socket.io

你好,

我是 socket.io 的新手,想知道为什么 socket.io 保持两个连接:

  1. 网络套接字
  2. XHR 轮询

同时?

这是不是有点傻?

最有用的评论

@rohittailor :我正在客户端上测试这个:

    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect({transports: ['websocket']});
    </script>

到目前为止一切顺利。 它完全避免了 XHR 连接。

所有45条评论

  • “XHR 轮询”不是一个连接,它可以使用多个连接。
  • websocket 和轮询传输尚未同时初始化。 事实上,这就是engine.io 所做的以及socket.io 一旦实现它很快就会做的。 在这里阅读更多,你可能会重新考虑“愚蠢”的标签,也许吧。

如果您遇到 socket.io 0.9 同时具有两个开放传输的情况,那将是一个错误,并且将不胜感激有关如何重现它的更多信息。

“XHR 轮询”不是一个连接,它可以使用多个连接。

是的,但是因为轮询对所有请求都在同一个 url 上工作。 我认为它应该模仿一个。

如果您遇到 socket.io 0.9 同时具有两个开放传输的情况,那将是一个错误,并且将不胜感激有关如何重现它的更多信息。

我不确定我们的意思是否相同,但是:Chromium 向我显示了一个打开的 websocket 连接,此外它还向 socket.io 发送轮询请求。
“愚蠢”现在意味着我无法享受可用的 websocket 连接轮询的好处。
难道 websocket 连接本身就足够了,xhr 轮询只能用作后备吗?

如果我错过了什么,请纠正我

@bodokaiser websocket 连接真的有效还是退回到轮询?

请记住,握手是常规的 HTTP

Chrome 显示 websocket 连接正在挂起。 没有错误信息。 我假设 ws 有效。 然而,我如何检查 socket.io 是否回落?

是的,这绝对不是握手。 我在 chrome 和节点控制台中看到 get 请求如何每 2000 毫秒重复一次。

node.js 日志记录对您有帮助吗?

问候

检查在 ws 连接中交换的帧(我认为只有 Chrome 有这个)。 如果您看不到任何数据,则它不起作用。

是的,似乎正在支持:

  debug - client authorized
   info  - handshake authorized yUEmr7drZfmWzWHdEZcp
GET /socket.io/1/?t=1344799805756 200 3ms
   debug - setting request GET /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815866
   debug - setting poll timeout
   debug - client authorized for 
   debug - clearing poll timeout
   debug - xhr-polling writing 1::
   debug - set close timeout for client yUEmr7drZfmWzWHdEZcp
GET /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815866 200 1ms
   debug - xhr-polling received data packet 5:::{"name":"hello","args":["world"]}
POST /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815871 200 1ms
   debug - setting request GET /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815872
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client yUEmr7drZfmWzWHdEZcp
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client T9eCOR7gCe3pLNtiEZco
   debug - xhr-polling closed due to exceeded duration
GET /socket.io/1/xhr-polling/T9eCOR7gCe3pLNtiEZco?t=1344799800945 200 20002ms
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client yUEmr7drZfmWzWHdEZcp
   debug - xhr-polling closed due to exceeded duration

@guille你能告诉我为什么它会后退吗?

你使用的是什么浏览器?

Mac OSX 版 Chroms 21

我也在 Chrome 21/Windows 21.0.1180.79 m 上看到了同样的问题——有一个 JSONP 轮询连接(似乎成功),同时 WebSocket 连接从未连接——它始终处于“待处理”状态。 Mac 上相同版本的 Chrome 似乎没问题。

这似乎与防火墙或防病毒无关,所有测试都通过 websocketstest.org 和 websocket.org/echo.html。

我正在使用 socket.io 0.9,但它似乎也出现在最新版本中。

@guille这个问题似乎也很容易重现。 我刚刚访问了一个使用 socket.io 的 WebSocket 传输的站点:

http://beta.blaggart.com

请注意,至少在 Windows 上的 Chrome 21 中,WS 连接的状态始终为“待处理”。

尝试使用 socket.io 大师?

刚刚试过大师,我有同样的问题。 认为这个问题也可能是#998 的骗局。

此外,就其价值而言,#998 中描述的解决方法确实对我有用,可以建立连接——禁用 websockets 并仅使用 xhr 和 jsonp 轮询。

这实际上是一个 chrome 错误吗?

www.websocket.org/echo.html进行测试时

有趣的是,当我在同一个网站上使用“安全 WebSocket (TLS)”时,websocket 就可以工作了。

Chrome 和 Firefox 的行为完全相同......非常奇怪......

服务器:

socket.on('loginout',function(){
    socket.emit('loginout',{uname:socket.name});
});

socket.on('登录',函数(数据){
socket.emit('l_msg',{uname:data.uname,score:data.score,type:true});
});

打印:
信息:握手授权11012331592122282453
调试:设置请求 GET /socket.io/1/xhr-polling/11012331592122282453?t=1353485202761
调试:设置轮询超时
调试:客户端授权
调试:清除轮询超时
调试:xhr 轮询写入 1::
调试:为客户端 11012331592122282453 设置关闭超时
调试:xhr-轮询接收到的数据包 20 5::{"name":"count"} 22 5:::{"name":"history"} 23 5:::{"name ":"用户列表"}
调试:设置请求 GET /socket.io/1/xhr-polling/11012331592122282453?t=1353485202792
调试:设置轮询超时
调试:丢弃传输
调试:清除客户端 11012331592122282453 的关闭超时
调试:清除轮询超时
调试:xhr 轮询写作 8::
调试:为客户端设置关闭超时 1896586469607627233
调试:xhr 轮询由于超过持续时间而关闭
调试:xhr-轮询收到数据包5:::{"name":"login","args":[{"uname":"gjjn","pwd":"3f01728152a0225ff9806c401ffdbe77"}]}
调试:清除轮询超时
调试:xhr 轮询写作 5:::{"name":"l_msg","args":[{"uname":"gjjn","type":true,"head":" http://42.121. 14.234/未定义"}]}
调试:为客户端 11012331592122282453 设置关闭超时
调试:xhr-轮询接收到的数据包 5:::{"name":"loginout"}
调试:websocket 写 5:::{"name":"l_msg","args":[{"uname":"gregergre","type":true,"head":" http://42.121.14.234/未定义"}]}
调试:为客户端发出心跳 5207531891749391108
调试:websocket 编写 2::
调试:为客户端设置心跳超时 5207531891749391108
调试:得到心跳包
调试:清除客户端的心跳超时 5207531891749391108
调试:为客户端设置心跳间隔 5207531891749391108
调试:websocket 写 5:::{"name":"loginout","args":[{}]}

xhr-polling 收到数据包 5:::{"name":"loginout"}。
但不是结果。

和这里一样。 我使用了相同的代码,但它适用于 Chrome MacOS 但不适用于 Chrome Windows

+1,请解决这个问题.. @LearnBoost

即使我看到了这一点,最后我也看到了 Websocket 连接和发送到 SOCKET.io 服务器的重复 XHR 请求

似乎 websocket 连接成功了,但我看到 XHR 请求

Request URL:ws://localhost:5000/socket.io/?EIO=2&transport=websocket&sid=XcMblHoZ0x97QRn_AAAE
Request Method:GET
Status Code:101 Switching Protocols
Request Headers CAUTION: Provisional headers are shown.
Cache-Control:no-cache
Connection:Upgrade
Cookie:io=XcMblHoZ0x97QRn_AAAE
Host:localhost:5000
Origin:http://localhost:3000
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
Sec-WebSocket-Key:EZixwYoUHpFFpgrEOqiS+w==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Query String Parametersview sourceview URL encoded
EIO:2
transport:websocket
sid:XcMblHoZ0x97QRn_AAAE
Response Headers
Connection:Upgrade
Sec-WebSocket-Accept:WHsiBZoW9stmULt+YX8wmNK1wx8=
Upgrade:websocket

这是 websocket 框架的样子
https://www.dropbox.com/s/v6szg9hka53erbc/Screenshot%202014-07-09%2011.12.33.png

和长轮询请求

https://www.dropbox.com/s/pf7d56tp85864bg/Screenshot%202014-07-09%2011.15.47.png

我在 Google Chrome 35.0.1916.153 上运行

和套接字问题版本是[email protected]

我有同样的问题。 任何更新? 使用 SocketIO 1.0.6

第一个请求总是 XHR,然后我们_升级_到 WebSocket(如果可以的话)。 后续轮询被中止(在某些情况下可能会有额外的轮询周期,但不会超过 1 个)

@guille至于我检查的内容,即使成功建立了 Websocket 连接,我也会看到重复的 XHR 轮询

你好,

解决此问题的解决方案是什么?

@rohittailor :我正在客户端上测试这个:

    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect({transports: ['websocket']});
    </script>

到目前为止一切顺利。 它完全避免了 XHR 连接。

这也解决了我的问题,websocket 工作正常,但也有一个肮脏的 XHR 轮询。 谢谢@gonzalodiaz

我真的很想看到一个场景,它成功升级到 WS,但 XHR 轮询周期在 Web Inspector 中无限期地继续!

(演示、视频、gif 动画,任何东西都可以)

我可以给你演示访问我的网站,明天托管在 MS Azure 云上。 您能给我们您的测试 URL 以及有关如何托管 socket.io 的更多详细信息吗?

那些会无限期地继续下去吗? 是否有重复的帧
回应? 你能不能用 DEBUG=* 和
当这种情况发生时,浏览器日志会显示localStorage.debug='*'


吉列尔莫·劳赫 – @rauchg https://twitter.com/rauchg

2014 年 10 月 14 日星期二晚上 10:59,Viren Negi通知@github.com
写道:

@guille https://github.com/guille这个怎么样

这是 websocket 框架的样子

https://www.dropbox.com/s/v6szg9hka53erbc/Screenshot%202014-07-09%2011.12.33.png

和长轮询请求

https://www.dropbox.com/s/pf7d56tp85864bg/Screenshot%202014-07-09%2011.15.47.png


直接回复此邮件或在 GitHub 上查看
https://github.com/Automattic/socket.io/issues/991#issuecomment -59161273
.

@guille我确实看到 xhr 响应无限期地重复不确定重复帧让我看看如果我能提供你需要的一切

不确定我能有多大帮助,但我注意到我只能连接到安全的网络套接字。 最近是否有一些安全更改需要标头(类似 CORS)来允许不安全的 WebSocket 连接?

WebSockets 一个月前为我工作,现在它只适用于 wss:// 连接。
Chrome 38.0.2125.104 - Windows 8.1.1

编辑:这些结果实际上可能是http://www.websocket.org/echo.html的问题
我一直无法在其他地方进行测试

WS 连接的成功实际上取决于网络/服务器能力。 SSL 保证在数据解密之前没有任何东西可以破坏它(尽管后续代理/负载平衡器仍然可以破坏它)。

我注意到它实际上是代码中的一个错误,它甚至从未轮询 WS 连接,我进行了更改然后它就起作用了。 如果我记得,我今晚会查看修改后的源代码。

但是,如果它对其他人有效,则可能是我的设置有问题,但它没有尝试连接,因为它认为 WS 不可用而没有尝试,将 && 更改为 || 解决它。

我想听更多!

仍然是一个(小)问题,客户端总是发出轮询请求而不是尝试其他传输。 我必须指定

{transports: ['websocket']}

为了让它工作,但客户端应该尝试所有的传输来找到好的,对吗?

这个问题是我在 2012/13 年开始研究自己的“纯”网络套接字包的原因

这个问题解决了吗? 我看到了类似的东西,但在我开始深入挖掘之前,我想快速搜索一下……评论?

自从我上次就这个问题发表评论以来,代码已经发生了很大的变化。 不太可能是同一个错误。 我似乎无法找到上次我怀疑导致问题的线路。 这并不是说它是固定的。

我的 socket.io 代码目前被一个错误 engine.io-client 阻止,所以我几个月没有使用 s.io 所以不能肯定地说这是否仍然是一个问题。

@nevercast您对 wss 工作的评论,但在我的情况下 ws 不完全正确。 感谢您指出这一点我一直在寻找这个问题一个多星期。 发现不知何故我网络上的任何 ws 连接都被阻止了,但 wss 工作正常。

这个网站很棒: http :

我有一个 socket io 问题,但不确定我错在哪里。
image

上图显示它在本地运行良好,但下图是在 AWS 环境中尝试时捕获的。

image

我有一个 socket io 问题,但不确定我错在哪里。
image

上图显示它在本地运行良好,但下图是在 AWS 环境中尝试时捕获的。

image

面临同样的问题

此页面是否有帮助?
0 / 5 - 0 等级