use*_*769 6 websocket node.js socket.io
我在端口80上运行的node.js中编写了http代理.我只需要将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);
Run Code Online (Sandbox Code Playgroud)
一切正常,但io.socket回归到xhr-polling.
http://localhost/client.htm - falls back to xhr-polling
file:///C:/.../client9090.htm - still uses websocket
Run Code Online (Sandbox Code Playgroud)
socket.io app在端口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);
});
});
Run Code Online (Sandbox Code Playgroud)
client.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>
Run Code Online (Sandbox Code Playgroud)
client9090.htm是相同的,但localhost被localhost:9090取代
正如我所说,everythig运行良好,唯一的问题是,node-http-proxy使得从websockets回退到xhr-polling.有人可以帮忙吗?
根据https://npmjs.org/package/http-proxy,当向 httpProxy.createServer() 添加回调时,您必须手动代理“升级”事件,因此如下所示:
httpProxy = require('http-proxy');
// added `var server =` here
var server = 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);
// added upgrade listener section here:
server.on('upgrade', function (req, socket, head) {
server.proxy.proxyWebSocketRequest(req, socket, head);
});
Run Code Online (Sandbox Code Playgroud)
但是,对于上面描述的用法,您甚至不需要回调函数 - 您可以轻松地执行以下操作:
httpProxy = require('http-proxy');
var options = {
pathnameOnly: true,
router: {
'/wiki': '127.0.0.1:8001',
'/blog': '127.0.0.1:8002',
'/api': '127.0.0.1:8003'
}
}
var proxyServer = httpProxy.createServer(options);
proxyServer.listen(80);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2006 次 |
最近记录: |