NodeJS 将HTTP升级重定向到另一个示例上的WebSocket

kxe2p93d  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(123)

我使用Node集群,在每个worker上都有一个正在运行的websocket服务器。主服务器正在运行HTTP服务器。
在主HTTP服务器上,我想要一个HTTP Upgrade调用实现,它将调用者连接到特定的Web套接字。
为什么?我希望能够将用户连接到正确的websocket,但我希望通过一个单一的入口点localhost:8000来完成。连接到localhost:8000可能会无缝连接到localhost:8001。
我的想法是使用如下参数调用Upgrade:

wscat -c ws://localhost:8000/?id=5

此调用应转到主服务器,主服务器将转发此升级调用并与localhost:8005建立连接。
我想我可以简单地用worker. send()将升级参数转发给worker,但这并不起作用,我在worker中接收的对象错过了很多东西,这可能是我不知道的一些JS基础知识。
下面是我的简单实现:

var http = require('http');
var cluster = require('cluster')
var ws = require('ws');

var NumberOfInstances = 5;

if (cluster.isMaster) {

    var forks = []
    for (var i=0; i < NumberOfInstances; i++) {
        forks.push(cluster.fork());
    }

    server = http.createServer((req, res) => {
        res.writeHead(200);
    }).listen(8000);

    server.on('upgrade', (request, socket, head) => {
        var params = new URL(`https://localhost:8000${request.url}`);
        var id = parseInt(params.searchParams.get('clusterId')) - 1;

        // How do I forward upgrade??
        forks[id].send({r: request, s: socket, h: head});
    })

} else {

    portStr = `800${cluster.worker.id}`;
    wss = new ws.WebSocketServer({
        port: portStr
    });

    wss.on('connection', (ws, request) => {
        console.log(`${cluster.worker.id} got connection.`);
    })

    process.on('message', masterMessage => {
        // This absolutely doesn't work. 
        wss.handleUpgrade(masterMessage.r, masterMessage.s, masterMessage.h, (ws) => {
            wss.emit('connection', ws, masterMessage.r);
        })
    })
}
kqlmhetl

kqlmhetl1#

根据文档,您需要将套接字处理程序作为第二个参数发送给worker.send方法。
所以你应该做这个,

forks[id].send({ headers: request.headers, method: request.method, head: head }, socket); //socket is in second argument

在您的子message事件处理程序中,执行以下操作:

process.on('message', (request,socket) => {
    
    wss.handleUpgrade(request, socket, request.head, (ws) => {
        wss.emit('connection', ws, request);
    })
})

看看这个例子,看看如何传递套接字对象作为一个参数。

相关问题