首页 > 解决方案 > 使用 1 个单端口的 Node.js express 和 net socket

问题描述

所以我大致有这个设置:

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 给出的那个),但我在这两个端口上运行了一些东西。

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

一般来说,我对表达和 Node.js 比较陌生,但我找不到任何关于此的内容

标签: node.jsexpressport

解决方案


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

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

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

实际上,您可能只是检查是否可以使用 webSocket 连接而不是 TCP 连接,因为它已经内置了此端口共享功能。


推荐阅读