Chrome和Safari恢复到xhr轮询,而不是与socket.io的websockets

我有一个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 

这发生在Chrome浏览器和Safari。 我已经更新到最新的socket.io版本0.6.17,并运行节点0.4.7。

我曾尝试删除我的cookie和cachingbuild议在github和SO,但问题依然存在。 此外,当我尝试强制websockets它永远不会完全连接到一个会话ID。

有没有人有任何想法?

目前所有的浏览器都不支持Websocket API(根据我的知识),它应该在铬上工作,尽pipe在铬或者Firefox上testing(在编辑默认设置之后),看看是否仍然恢复为XHRPolling。

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

从这里可能有两个不同的原因

  1. Web / Flash套接字将不会让你连接到node.js客户端,除非你指定一个不同的端口像81或你特别指定apache代理到节点的传入请求。 一个简单的解决scheme可能是编写基于Node.js的HTTP服务器来传递Apache的数据(并将Apache设置为在不同的端口上运行,然后是80)

    这个链接告诉如何做…在这个过程中,你可以让Node.js做一些检查,如果请求来自websocket / httpbrowser,如果这是一个http浏览器转发请求到Apache,如果不是,即如果这是从Web /闪光灯sockets然后相应地处理sockets。 或者就这个问题发表评论。 指定APACHE代理Node.js.

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

正如在socket.io主要网站上所述

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

  • 的WebSocket
  • Adobe®Flash®套接字
  • AJAX长轮询
  • AJAX多部分stream
  • 永远Iframe
  • JSONP轮询

很明显,如果禁用了Web套接字并且Adobe Flash Socket无法连接(这可能是由于策略文件不可用),它将恢复为AJAX长轮询。

下面是跨域文件的示例代码,您可以将其包含在代码中,并查看是否使您的服务器使用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);