Chrome和Safari恢复为xhr-polling而不是带socket.io的websockets

Kit*_*Kit 22 javascript websocket node.js socket.io

我有websockets和socket.io的问题.当我尝试使用socket.io连接到我的节点服务器时,它最初使用websockets进行连接,但之后不久将恢复为jsonp-polling.

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

有没有人有任何想法?

Shr*_*low 13

目前在所有浏览器中默认不支持Websocket API(据我所知)它应该在chrome上工作但尝试在chrome或firefox上测试它(在编辑默认设置之后)并查看是否仍然恢复到XHRPolling.

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

现在可能有两种不同的原因来自这里

  1. Web/Flash套接字不会让你连接到node.js客户端,除非你指定一个像81这样的不同端口,或者你特意指定apache来代理对Node的传入请求.一个简单的解决方案是编写基于Node.js的HTTP服务器,只是从Apache中继数据(并设置Apache在不同的端口运行,然后80)

    此链接告诉如何执行此操作...在此过程中,您可以使Node.js执行类似检查请求是否来自websocket/httpbrowser,如果这是一个http浏览器将请求转发给Apache,如果不是,即如果来自web /闪存套接字然后相应地处理插座.或者对问题发表评论.指定APACHE代理Node.js.

  2. Flashsockets要求您在端口843上提供跨域策略文件,您确定要提供跨域文件吗?(我认为socket.io具有内置功能,但仍然很好检查.)

正如socket.io主网站上所说的那样

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

  • 的WebSocket
  • Adobe®Flash®插槽
  • AJAX长轮询
  • AJAX多部分流媒体
  • 永远的iframe
  • JSONP轮询

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

下面是跨域文件的示例代码,您可以在代码中包含这些代码,看看是否使您的服务器使用websockets运行.

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); 
Run Code Online (Sandbox Code Playgroud)