
程序中有两个服务:一个是普通的 TCP 服务,另一个是 HTTP/HTTPS 服务,因此需监听两个端口。
现在想让程序只监听一个端口:根据 socket 收到的第一条数据,如果是 TCP 服务的协议头,那么仍走原先的逻辑;如果不是,则派发给 http server 去处理。
是否有简单优雅的实现方案?
1 ysc3839 2023-05-23 18:23:22 +08:00 via Android 建议用 nginx 之类的外部其他程序来实现。没记错的话 Node.js 内置的 http server 没有这样的功能,你也拿不到它内部的 socket ,没这么强的扩展性。 |
2 zbinlin 2023-05-23 19:31:26 +08:00 有方案可以实现,但不会简单优雅。可以使用 net 模块创建 server ,然后监听 server 的 connection 事件,在事件中可以拿到 socket ,然后通过读取 socket 前面的一些字节来判断是 普通的 TCP 服务还是 HTTP 服务,然后再将这个 socket stream pipe 到对应是服务上(注意需要来回) |
3 iloveayu 2023-05-23 19:40:42 +08:00 可以,能 bind socket 端口就可以搞,Node.js 提供了。 是否有简单优雅的实现方案? 否,没人写,所以需要自己动手。 2 楼已经说的很完整了。 |
4 jack4536251 2023-05-23 20:09:08 +08:00 via Android @ysc3839 nodejs 启动服务只能用自己的 http server 吧 |
5 ysc3839 2023-05-23 20:13:38 +08:00 via Android @jack4536251 什么意思?外部程序就是指反向代理,Node.js 开两个端口 |
6 documentzhangx66 2023-05-23 22:36:41 +08:00 你需要的是 nginx 。 nginx 本身就是 http server 。 然后搜 nginx as tcp proxy 来处理 tcp 。 |
7 leonshaw 2023-05-23 22:56:39 +08:00 可以,我之前写过一个,正常使用还行,但是没办法优雅。主要问题是什么叫“第一条数据”,第一次 recv 收到的数据量不够怎么处理,怎么定义协议特征。 |
8 voidmnwzp 2023-05-23 23:00:53 +08:00 via iPhone 直接都用 http 根据 body 或者 header 的标志判断是否 upgrade 跟 websocket 协议类似 如果是 tcp 则走 tcp socket |
9 johnhom 2023-05-24 08:37:03 +08:00 其实 tcp 和 http 是可以监听同一个端口的,但是要分成 ipv4 和 ipv6 |