Chrome&Safari恢复到xhr轮询,而不是使用socket.io的websockets

Chrome & Safari revert to xhr-polling rather than websockets with socket.io

本文关键字:socket websockets io amp Safari 恢复 轮询 xhr Chrome      更新时间:2023-09-26

我的websockets和socket.io有问题。当我尝试用socket.io连接到我的节点服务器时,它最初使用websockets连接,但不久后恢复到jsonp轮询。

这是我连接时节点服务器的输出:

8 Jun 07:01:15 - Initializing client with transport "websocket"
8 Jun 07:01:19 - Initializing client with transport "jsonp-polling"
8 Jun 07:01:19 - Client 16630339180119336 connected

这种情况发生在Chrome&Safari。我已经更新到最新的socket.io版本0.6.17,并且正在运行节点0.4.7。

我已经尝试按照github和SO上的建议删除我的cookie和缓存,但问题仍然存在。此外,当我试图强制使用websocket时,它永远不会与会话ID完全连接。

有人有什么想法吗?

Websocket API目前在所有浏览器中默认不受支持(据我所知),它应该在铬上工作,尽管尝试在铬或firefox上测试它(编辑默认设置后),看看它是否仍恢复为XHRPolling。

我在不同的IP上运行它,因为我需要在端口80上运行节点,这会导致我的web服务器与Apache发生冲突。websockets/flashsockets不能跨域使用吗?

现在可能有两个不同的原因导致错误从这里

  1. Web/Flash Sockets不会让你连接到node.js客户端,除非你指定了一个不同的端口,比如81,或者你特别指定了apache来代理node的传入请求。一个简单的解决方案可以是编写基于Node.js的HTTP服务器来中继来自Apache的数据(并将Apache设置为在不同的端口上运行,然后是80)

    这个链接告诉如何做到这一点。。。在这个过程中,你可以让Node.js做一些事情,比如检查请求是否来自websocket/httpbrowser,如果是http浏览器,则将请求转发给Apache,如果不是,即如果是来自web/flash套接字,则相应地处理套接字。或如对该问题所评论的那样。指定APACHE代理到Node.js.

  2. Flashsockets要求您在端口843上提供跨域策略文件。您确定要提供跨域文件吗?(我认为socket.io有内置的功能可以做到这一点,但检查起来仍然很好。)

如socket.io主网站上所述

为了在每个浏览器上提供实时连接,Socket。IO在运行时选择能力最强的传输,而不会影响API。

  • WebSocket
  • Adobe®Flash®套接字
  • AJAX长轮询
  • AJAX多部分流
  • Forever Iframe
  • JSONP轮询

很明显,如果websocket被禁用并且Adobe Flash Socket无法连接(这可能是由于策略文件不可用),它将恢复到AJAX Long Polling。

下面是跨域文件的示例代码,您可以将其包含在代码中,看看这是否会使您的服务器使用websocket运行。

var net = require("net");
// Node.js 
var Policy = net.createServer(function(socket)
{
    socket.setEncoding('utf8');
    socket.on('connect',function(){
        console.log("Policy Request");
        socket.end("<?xml version='"1.0'"?><!DOCTYPE cross-domain-policy SYSTEM '"/xml/dtds/cross-domain-policy.dtd'"><cross-domain-policy><allow-access-from domain='"*'" to-ports='"*'" secure='"false'"/></cross-domain-policy>");
    });
});
Policy.listen(843);