Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 铬及;Safari恢复到xhr轮询,而不是使用socket.io的WebSocket_Javascript_Node.js_Websocket_Socket.io - Fatal编程技术网

Javascript 铬及;Safari恢复到xhr轮询,而不是使用socket.io的WebSocket

Javascript 铬及;Safari恢复到xhr轮询,而不是使用socket.io的WebSocket,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我对WebSocket和socket.io有问题。当我尝试使用socket.io连接到我的节点服务器时,它最初使用WebSocket进行连接,但不久之后恢复到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 -

我对WebSocket和socket.io有问题。当我尝试使用socket.io连接到我的节点服务器时,它最初使用WebSocket进行连接,但不久之后恢复到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,并且正在运行node 0.4.7

我已经尝试按照github上的建议删除我的cookie和缓存,但问题仍然存在。此外,当我试图强制WebSocket时,它从未与会话ID完全连接


有人有什么想法吗?

目前所有浏览器默认都不支持Websocket API(据我所知),它应该可以在chromium上运行,不过尝试在chromium或firefox上测试一下(编辑默认设置后),看看是否仍然恢复为Xhrpoll


我在另一个IP上运行它,因为我需要在端口80上运行节点,这会导致我的web服务器与Apache发生冲突。WebSocket/FlashSocket不能跨域使用吗

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

  • Web/Flash套接字不允许您连接到node.js客户端,除非您指定不同的端口(如81)或您专门指定apache来代理传入的请求到node。 一个简单的解决方案可能是编写基于Node.js的HTTP服务器,以便只中继来自Apache的数据(并将Apache设置为在不同的端口上运行,然后设置为80)

    告诉你怎么做。。。在此过程中,您可以让Node.js执行类似的操作,如检查请求是否来自websocket/httpbrowser(如果是http浏览器),则将请求转发给Apache(如果不是ie,则来自web/flash套接字),然后相应地处理套接字。或者正如我对这个问题的评论。指定APACHE代理Node.js

  • FlashSocket要求您在端口843上提供跨域策略文件。您确定要提供跨域文件吗?(我认为socket.io内置了这样做的功能,但检查总是很好的。)

  • 如socket.io主网站所述

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

    • 网袋
    • Adobe®Flash®套接字
    • AJAX长轮询
    • AJAX多部分流
    • 永远的Iframe
    • JSONP轮询
    很明显,如果WebSocket被禁用并且AdobeFlashSocket无法连接(这可能是由于策略文件不可用),它将恢复为AJAX长轮询

    下面是一个跨域文件的示例代码,您可以将其包含在代码中,看看这是否会使您的服务器使用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); 
    
    var net=require(“net”);
    //Node.js
    var Policy=net.createServer(函数(套接字)
    {
    socket.setEncoding('utf8');
    socket.on('connect',function(){
    console.log(“策略请求”);
    插座。结束(“”);
    });
    });
    政策。倾听(843);
    
    由于它升级到jsonp,这意味着您必须以跨域方式使用socket.io。尝试在同一个域上运行websocket服务器我在不同的IP上运行它,因为我需要在端口80上运行节点,这会导致我的web服务器与Apache发生冲突。WebSocket/FlashSocket不能跨域使用吗?WebSocket和FlashSocket可以跨域工作,您可以在socket.io src中看到,在
    xdomainCheck
    函数中,两者都返回一个总括
    true
    ,如果涉及代理,则可能与代理相关,而不是与客户端相关。Apache是否充当此socket.io服务器的代理?最后一条评论可能就是原因。如果您的节点运行在Apache或Nginx等代理之后,则无法运行WebSocket(除非您专门为TCP代理对其进行了修补)。