socket.io示例有时在使用反向代理时不连接客户端

时间:2013-11-22 14:02:06

标签: node.js socket.io node-http-proxy

使用node-http-proxy,我为路由请求设置了反向代理:

var httpProxy = require('http-proxy');
var server = httpProxy.createServer({
    hostnameOnly: true,
    router: {
        'www.example.com': 'localhost:3002'
    }
}).listen(80);

现在,当我在http://socket.io/#how-to-use上运行第一个示例时,套接字有时不会与客户端连接。我创建了两个文件来测试它:server.js和index.html。要启动节点应用程序,我运行server.js。

server.js:

var app = require('http').createServer(handler)
    , io = require('socket.io').listen(app)
    , fs = require('fs')

app.listen(3002);

function handler (req, res) {
    fs.readFile(__dirname + '/index.html',
    function (err, data) {
        if (err) {
            res.writeHead(500);
            return res.end('Error loading index.html');
        }

        res.writeHead(200);
        res.end(data);
    });
}

io.sockets.on('connection', function (socket) {
    console.log("Socket connected");
});

的index.html:

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect();
    setInterval(function() {
        console.log(socket.socket.connected);
    }, 1000)
</script>

当客户端没有连接时,在套接字与服务器连接后,我反复得到以下输出,间隔为+/- 10秒:

debug - setting request GET /socket.io/1/xhr-polling/Cqcw5xUjQ-B-Hw3FGF7Y?t=1385128607702
debug - setting poll timeout
debug - discarding transport
debug - cleared heartbeat interval for client Cqcw5xUjQ-B-Hw3FGF7Y

现在,当我刷新浏览器几次时,套接字总是与服务器连接(也就是说,它始终记录“Socket connected”),但有时它不会连接客户端:刷新index.html后,console.log(socket.socket.connected)有时会重复打印“false”,在另一次页面刷新后,它可能会重复打印“true”“false如果套接字没有或确实与客户端连接,则再次“

当我不使用反向代理时,该示例在客户端工作,因此当我在www.example.com上的端口80上运行server.js时。如果有人能指出我可能导致这个问题的原因,那就太好了。我使用的是node.js v0.8.23,socket.io版本0.9.14和node-http-proxy版本0.10.1。

更新

可能我实际上使用的是节点v0.10.21。我以为我是通过使用nvm切换节点版本来使用v0.8.23,但由于某种原因它继续切换回v0.10。它是known issue,http-proxy不支持0.8以后的节点版本的Web套接字,因此可能是原因。我正在使用robertklep的解决方案,直到找到更好的东西。

2 个答案:

答案 0 :(得分:1)

我认为问题可能是socket.io最初尝试使用WebSockets作为传输媒介,当它不起作用时(我不知道node-http-proxy是否可以代理WS连接),它回退到一个有效的传输(xhr-polling),但客户端和/或服务器在此过程中感到困惑。

尝试停用websocketflashsocket传输,看看是否能让它更可靠:

io.set('transports', [ 'xhr-polling', 'jsonp-polling', 'htmlfile' ]);

more info

答案 1 :(得分:1)

它确实是我使用的节点版本。 Node-http-proxy不适用于节点版本&gt; 0.8(参见Node http proxy with proxytable and websockets)。我以为我使用的是v0.8.23,但实际上我使用的是v0.10.21。通过使用n,我可以确保节点为v0.8.23工作,现在它似乎可以正常工作。我强烈建议您重置节点版本。