gpt4 book ai didi

node.js - 使用 Node http-proxy 代理 websocket 连接

转载 作者:IT老高 更新时间:2023-10-28 23:10:12 26 4
gpt4 key购买 nike

我有一个通过 socket.io 使用 websockets 的应用程序。对于我的应用程序,我想使用单独的 HTTP 服务器来为我的应用程序提供静态内容和 JavaScript。因此,我需要放置一个代理。

我正在使用 node-http-proxy .作为起点,我的 websockets 应用程序在端口 8081 上运行。我使用以下代码将 socket.io 通信重定向到此独立服务器,同时使用 express 提供静态内容:

var http = require('http'),
httpProxy = require('http-proxy'),
express = require('express');

// create a server
var app = express();
var proxy = httpProxy.createProxyServer({ ws: true });

// proxy HTTP GET / POST
app.get('/socket.io/*', function(req, res) {
console.log("proxying GET request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});
app.post('/socket.io/*', function(req, res) {
console.log("proxying POST request", req.url);
proxy.web(req, res, { target: 'http://localhost:8081'});
});

// Proxy websockets
app.on('upgrade', function (req, socket, head) {
console.log("proxying upgrade request", req.url);
proxy.ws(req, socket, head);
});

// serve static content
app.use('/', express.static(__dirname + "/public"));

app.listen(8080);

上面的应用程序工作得很好,但是,我可以看到 socket.io 不再使用 websockets,而是回退到 XHR 轮询。

我可以通过查看代理代码中的日志来确认:

proxying GET request /socket.io/1/?t=1391781619101
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying POST request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=1391781629
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294

有谁知道如何代理网络套接字通信? node-http-proxy 中的所有示例都假设您要代理所有流量,而不是代理一些流量并为其他流量提供服务。

最佳答案

刚刚偶然发现您的问题,我看到它仍然没有回答。好吧,如果您仍在寻找解决方案...您的代码中的问题是 app.listen(8080) 只是

的语法糖
require('http').createServer(app).listen(8080)

app 本身只是一个处理函数,而不是 httpServer 的一个实例(我个人认为应该从 Express 中移除这个特性以避免混淆)。因此,您的 app.on('upgrade') 实际上从未使用过。你应该写

var server = require('http').createServer(app);
server.on('upgrade', function (req, socket, head) {
proxy.ws(req, socket, head);
});
server.listen(8080);

希望,这会有所帮助。

关于node.js - 使用 Node http-proxy 代理 websocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629752/

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