我在 node.js 中编写了 http 代理,在端口 80 上运行。我需要的只是将 socket.io 流量重定向到端口 9090,并将标准 http 流量重定向到 8080 上的 Apache。这是我的代理代码:
httpProxy = require('http-proxy');
httpProxy.createServer(function (req, res, proxy) {
if (req.url.match(/socket.io/)) {
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9090
});
} else {
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 8080
});
}
}).listen(80);
一切正常,但 io.socket 回退到 xhr-polling。
http://localhost/client.htm - falls back to xhr-polling
file:///C:/.../client9090.htm - still uses websocket
socket.io 应用在 9090 端口上运行,client.htm 连接到 80,client9090.htm 直接连接到 9090。
看起来 node-http-proxy 使 socket.io 应用程序在 xhr-polling 模式下工作。客户端是 Chrome v.25
socket.io 应用程序代码
var io = require('socket.io').listen(9090);
io.on('connection', function (socket) {
socket.on('hi!', function (data) {
console.log(data);
socket.emit('news');
});
socket.on('ahoj', function (data) {
console.log(data);
});
});
客户端.htm 代码
<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
var chat = io.connect('http://localhost')
chat.on('connect', function () {
chat.emit('hi!');
});
chat.on('news', function () {
chat.emit('ahoj',{a:1,b:2});
});
</script>
client9090.htm 相同,但 localhost 替换为 localhost:9090
正如我所说,一切都很好,唯一的问题是,node-http-proxy 会从 websockets 退回到 xhr-polling。任何人都可以帮忙吗?