使用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的解决方案,直到找到更好的东西。
答案 0 :(得分:1)
我认为问题可能是socket.io
最初尝试使用WebSockets作为传输媒介,当它不起作用时(我不知道node-http-proxy
是否可以代理WS连接),它回退到一个有效的传输(xhr-polling
),但客户端和/或服务器在此过程中感到困惑。
尝试停用websocket
和flashsocket
传输,看看是否能让它更可靠:
io.set('transports', [ 'xhr-polling', 'jsonp-polling', 'htmlfile' ]);
答案 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工作,现在它似乎可以正常工作。我强烈建议您重置节点版本。