【问题标题】:socket.io example sometimes not connecting client side when using a reverse proxy使用反向代理时,socket.io 示例有时不连接客户端
【发布时间】:2013-11-22 14:02:05
【问题描述】:

使用 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>

当客户端不连接时,socket与服务器连接后,我以+/- 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”),但有时它不连接客户端: console.log(socket.socket.connected)刷新index.html后有时会重复打印"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 的解决方案,直到找到更好的解决方案。

【问题讨论】:

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


    【解决方案1】:

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

    尝试禁用 websocketflashsocket 传输,看看是否更可靠:

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

    (more info)

    【讨论】:

    • 这确实使套接字工作一致,但是,我每 +/- 10 秒收到以下消息(尽管它仍然有效):调试 - 清除轮询超时调试 - xhr-polling 写入 8::调试 - 为客户端 U-xdq5jRtzoK6f9qXi4V 设置关闭超时调试 - 由于超过持续时间而关闭 xhr-polling 调试 - 设置请求 GET /socket.io/1/xhr-polling/U-xdq5jRtzoK6f9qXi4V?t=1385133212017 调试 - 设置轮询超时调试 -丢弃传输调试 - 清除客户端 U-xdq5jRtzoK6f9qXi4V 的关闭超时
    • @GuidoPassage 也许this answer 可能会提供一些见解(尽管我并不完全清楚它是关于什么的:)
    • 很高兴知道。我将使用您的解决方案,直到找到更好的解决方案。我的网站还没有被频繁访问,所以性能差异应该不会太重要。感谢您的建议。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-04
      • 2019-09-05
      • 2014-04-14
      • 2013-12-31
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多