Node.js 使用 1 个单端口的 express 和 net socket

Node.js express and net socket using 1 single port

所以我大概有这样的设置:

const net = require('net');
const express = require('express');

const socketsHostPort = 8082;
const websiteHostPort = process.env.PORT

const app = express();
app.get(/* Setup stuff etc */)
// A lot of app setup stuff here of course
app.listen(websiteHostPort);

let socket_server = net.createServer(/* Do stuff with the sockets */);
socket_server.listen(hostPort, 192.168.0.101);

现在我当然想把它托管在某个地方,但问题是它使用了 2 个独立的端口(8082 和一个环境给定的端口,如代码中所示)。

我想托管的地方只给了我一个端口(process.env.PORT 给的那个),但是我在这两个端口上有东西 运行ning。

我可以使用 express 以某种方式(或其他方式)使这两个 运行 只有一个端口吗?也许特定路径可用于 Node.js 网络套接字?

总的来说,我对表达和 Node.js 比较陌生,但是我找不到任何关于这个的东西

通过特定设计或一些严重的黑客攻击,两种协议之间的端口共享是可能的。具体设计的一个例子是webSocket协议。它专门设计用于能够与 http 服务器共享一个端口。他们通过使用具有一些自定义 headers 集的 http 请求启动每个 webSocket 连接来做到这一点。 http 服务器或 http 服务器中的请求处理程序可以识别那些特定的 headers 然后可以将代码分流到 webSocket 处理代码,然后两端可以同意更改他们使用的协议而不是 webSocket 协议http协议。

没有这么具体的分享设计,就难多了。您将必须有一个接受传入连接的通用 TCP 服务器,然后检查到达的第一组数据并确定该数据是否看起来属于 http 请求(在这种情况下,它将套接字传递给由http 服务器逻辑)或者数据是否看起来像您在 TCP 套接字上使用的任何协议 运行。

普通 TCP 连接没有关联的路径。这是 http 请求的一部分,因此如果您想使用请求路径进行区分,那么您必须执行类似 webSocket 设计的操作,其中所有连接请求都以实际的 http 请求开头,此时,您还可以使用自定义 headers 也在请求中。

事实上,您可能只是检查是否可以使用 webSocket 连接而不是 TCP 连接,因为它已经具有此端口共享功能built-in。