我有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&苹果浏览器。 我已更新到最新的socket.io版本0.6.17并且正在运行节点0.4.7。
我已经尝试删除我在github和SO上建议的cookie和缓存,但问题仍然存在。此外,当我尝试强制使用websockets时,它永远不会与会话ID完全连接。
有没有人有任何想法?
答案 0 :(得分:13)
目前在所有浏览器中默认不支持Websocket API(据我所知)它应该在chrome上工作但尝试在chrome或firefox上测试(在编辑默认设置之后)并查看是否仍然恢复到XHRPolling。
我在不同的IP上运行它,因为我需要在端口80上运行节点,这会导致我的Web服务器与Apache发生冲突。 websockets / flashsockets不能跨域使用吗?
现在可能有两种不同的原因来自这里
Web / Flash套接字不会让你连接到node.js客户端,除非你指定一个像81这样的不同端口,或者你特意指定apache来代理对Node的传入请求。 一个简单的解决方案是编写基于Node.js的HTTP服务器,只是从Apache中继数据(并设置Apache在不同的端口运行,然后80)
This link告诉你如何做到这一点...在这个过程中你可以让Node.js做一些事情,比如检查请求是否来自websocket / httpbrowser,如果这是一个http浏览器将请求转发给Apache,如果没有即如果来自web / flash套接字的那个然后相应地处理套接字。或者对问题发表评论。指定APACHE代理Node.js。
Flashsockets要求您在端口843上提供跨域策略文件,您确定要提供跨域文件吗? (我认为socket.io具有内置功能,但仍然很好检查。)
正如socket.io主网站上所述
为了在每个浏览器上提供实时连接,Socket.IO在运行时选择功能最强大的传输,而不会影响API。
很明显,如果禁用了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);