javascript - Chrome 和 Safari 使用 socket.io 恢复为 xhr-polling 而不是 websockets

标签 javascript node.js websocket socket.io

我对 websockets 和 socket.io 有疑问。当我尝试使用 socket.io 连接到我的 Node 服务器时,它最初使用 websockets 连接,但不久之后又恢复为 jsonp-polling。

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

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 并且正在运行 Node 0.4.7。

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

有人有什么想法吗?

最佳答案

目前所有浏览器默认不支持 Websocket API(据我所知)它应该可以在 chromium 上工作,尽管尝试在 chromium 或 firefox 上测试它(在编辑默认设置后),看看是否仍然恢复到XHR 轮询。

I am running it on a different IP as I need to run node on port 80 which causes conflict on my web server with Apache. Can websockets/flashsockets not be use cross-domain?

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

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

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

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

如 socket.io 主网站所述

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

  • WebSocket
  • Adobe® Flash® Socket
  • AJAX 长轮询
  • AJAX 多部分流式传输
  • 永远的 iframe
  • JSONP 轮询

很明显,如果 websocket 被禁用并且 Adob​​e 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); 

关于javascript - Chrome 和 Safari 使用 socket.io 恢复为 xhr-polling 而不是 websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280712/

相关文章:

javascript - 使用 jQuery mouseover 定位单个类的子实例

JavaScript Date.toLocaleDateString() - 仅设置选项

image - Golang Websocket 检测文件消息并在超过 1 个 ws 帧字节时写入

python - 调试一个类似 "hangs"的 python 应用程序

javascript - Angular 错误 : [$injector:unpr] while adding ui. Bootstrap

javascript - 从函数返回的变量在返回后是未定义的

javascript - NodeJs后端代码结构

node.js - Mongoose 为什么要添加空白数组?

json - 避免使用node.js在rest api中进行缓存

javascript - 使用node-http-proxy在同一子域下代理 Node 服务器和websocket服务器