我的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不能跨域使用吗?
现在可能有两个不同的原因导致错误从这里
-
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.
-
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);