2010-12-12 72 views
3

Chrome浏览器正在加载长轮询,并且加载指示灯不停止。NodeJS&Socket.io:Chrome浏览器未加载WebSockets

为什么Chrome不使用WebSockets,以及如何防止加载指示器在使用长轮询时旋转?

我使用的是最新的socket.io和V2.5的NodeJS

-

我第一次连接时,它使用的WebSocket,但断开马上与XHR轮询重新连接。

+1

告诉我你的Chrome版本,我告诉你答案:) – 2010-12-12 10:21:55

+0

Chrome 8 - http://cl.ly/3din – 2010-12-15 18:21:56

+0

万分感谢发布这个问题!当然还有+1 :) – 2013-10-30 10:47:31

回答

2

我有类似的问题,我发现有一个socketio cookie重写传输方法为“xhr-polling”。我不知道饼干如何到达那里,但删除它却有窍门。

这是对查找cookie的行的引用。 https://github.com/LearnBoost/Socket.IO/blob/master/socket.io.js#L1023

+0

我找到了cookie并将其删除。它仍然不起作用:\ – 2010-12-16 23:18:27

+0

我找到了cookie,将它删除了,它为我解决了这个问题。谢谢! – 2010-12-29 05:44:29

+0

删除cookie解决了这个问题,也是我期待已久的问题,为什么地狱websocket从来没有工作,即使在我最新的铬30。非常感谢这个答案。 +1 – 2013-10-30 10:48:43

0

我使用的是Chrome 8并且WebSockets显示工作正常。

如果您使用的是socket.io,则应该在长轮询(或永远iframe)之前回退到FlashSockets甚至xhr-multipart。在服务器和客户端上初始化socket.io时检查您的传输选项。

+0

我在webfaction上使用了两个不同的子域 - 我能想到的唯一的事情是它回退到轮询,因为它认为它的跨域?可能与webfaction有关。 – 2010-12-15 18:31:33

+0

尝试设置传输强制不轮询的特定传输。 – 2010-12-16 14:04:24

+0

我试着在客户端的选项中设置它,它仍然与xhr-polling连接。有没有办法强制它在服务器上? – 2010-12-16 23:09:41

2

看来socket.io.js有控制这个的选项。

  • tryTransportsOnConnectTimeout - 默认值是true
  • rememberTransport - 默认值是true

我相信,如果 'tryTransportsOnConnectTimeout' 设置为 '真',那么socket.io将通过所有的传输机制迭代连接并使用成功的第一个。

如果'rememberTransport'设置为'true',则成功的传输将存储在cookie中。

在我的应用程序中,我实现了断开连接时重新连接的逻辑。我发现我必须将上述两个选项都设置为'false',以防止回落到不希望的交通工具上。发生这个问题是因为在断开连接之后,服务器可能在任何时候都可用(而客户端尝试长时间轮询而不是websockets)。如果发生这种情况,cookie将被设置,并且后续连接将继续使用不需要的传输。