gpt4 book ai didi

node.js:将 websockets 代理到其他端口

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:37 25 4
gpt4 key购买 nike

我已经在运行在端口 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);

一切正常,但 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);
});
});

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>

client9090.htm 相同,但 localhost 替换为 localhost:9090

正如我所说,一切都很好,唯一的问题是,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);
});

但是,对于您上面描述的用法,您甚至不需要回调函数 - 您可以轻松地执行以下操作:

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);

关于node.js:将 websockets 代理到其他端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15064719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com