3

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

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

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

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

4

1 回答 1

3

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

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

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

不幸的是,HTTP 服务器硬连线到 TCP 服务器(参见源代码):

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');
};
于 2013-10-09T10:56:29.607 回答