0

使用 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");
});

索引.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.js 后console.log(socket.socket.connected)重复打印"false" 。 html,并且在另一个页面刷新后,如果套接字没有或确实与客户端连接,它可能会再次重复打印“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。一个已知问题是 http-proxy 不支持 0.8 之后的节点版本的 Web 套接字,因此这可能是原因。我正在使用 robertklep 的解决方案,直到找到更好的解决方案。

4

2 回答 2

1

这确实是我使用的节点版本。Node-http-proxy 不适用于节点版本 >0.8(请参阅Node http proxy with proxytable 和 websockets)。我以为我使用的是 v0.8.23,但实际上我使用的是 v0.10.21。通过使用n,我可以肯定地让节点为 v0.8.23 工作,现在它似乎工作了。我强烈推荐 n 来重置节点版本。

于 2013-11-22T17:47:35.710 回答
1

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

尝试禁用websocketandflashsocket传输,看看这是否使它更可靠:

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

更多信息

于 2013-11-22T14:27:16.727 回答