gpt4 book ai didi

node.js - 在主进程上监听 HTTP 流量,在子进程上处理连接?

转载 作者:搜寻专家 更新时间:2023-10-31 23:49:03 28 4
gpt4 key购买 nike

我正在寻找一种方法,让套接字在主进程上监听 HTTP 请求,然后使用 process.send() 将任何传入连接和请求数据传递给子进程,并在子进程中处理 HTTP 请求过程。

但是,如果不通过套接字上的 .listen() 初始化服务器,我无法找到一种方法将传递的连接和请求数据附加到子进程中的 HTTP 服务器。

那么,是否有可能使用 HTTP 服务器来处理从另一个进程传入的连接?任何非公共(public) API 解决方案也都可以(不过希望是 JavaScript 端)。

我想我可以初始化服务器以监听一些虚拟套接字,然后从那里反弹传入的连接,但这似乎不是最佳选择。在我的情况下,同时传入监听套接字或使用集群或反向代理也不是最佳选择。

最佳答案

这是可能的,但首先您需要了解 node.js 的工作原理:

  • TCP 服务器(来自 net.createServer)基本上是一个 EventEmitter,它只发出 connection 事件。

  • HTTP 服务器(来自 http.createServer)是带有连接解析器的 TCP 服务器。

不幸的是,HTTP 服务器硬连接到 TCP 服务器(see source):

function Server(requestListener) {
if (!(this instanceof Server)) return new Server(requestListener);
net.Server.call(this, { allowHalfOpen: true });

...

this.addListener('connection', connectionListener);

...
}

您需要将套接字传递给 http.js 中定义的 connectionListener。好消息是模块导出它:

exports._connectionListener = connectionListener;

我还没有尝试过这段代码,但它应该可以进行一些调整:

var util = require('util'),
events = require('events'),
http = require('http'),
express = require('express'),
app = express();

function FakeServer() {
events.EventEmitter.call(this);

this.on('connection', http._connectionListener);
this.on('request', app);
}

util.inherits(FakeServer, events.EventEmitter);

var server = new FakeServer();

process.on('message', function ('socket', socket) {
server.emit('connection', socket);
});

// you can use app as a regular express app
app.get('/hello', function (req, res) {
res.send('world');
};

关于node.js - 在主进程上监听 HTTP 流量,在子进程上处理连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268055/

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