NodeJS 中 TCP 和 HTTP 服务可复用同个端口吗?

2023-05-23 18:19:18 +08:00
 iqoo

程序中有两个服务:一个是普通的 TCP 服务,另一个是 HTTP/HTTPS 服务,因此需监听两个端口。

现在想让程序只监听一个端口:根据 socket 收到的第一条数据,如果是 TCP 服务的协议头,那么仍走原先的逻辑;如果不是,则派发给 http server 去处理。

是否有简单优雅的实现方案?

1904 次点击
所在节点    程序员
11 条回复
ysc3839
2023-05-23 18:23:22 +08:00
建议用 nginx 之类的外部其他程序来实现。没记错的话 Node.js 内置的 http server 没有这样的功能,你也拿不到它内部的 socket ,没这么强的扩展性。
zbinlin
2023-05-23 19:31:26 +08:00
有方案可以实现,但不会简单优雅。可以使用 net 模块创建 server ,然后监听 server 的 connection 事件,在事件中可以拿到 socket ,然后通过读取 socket 前面的一些字节来判断是 普通的 TCP 服务还是 HTTP 服务,然后再将这个 socket stream pipe 到对应是服务上(注意需要来回)
iloveayu
2023-05-23 19:40:42 +08:00
可以,能 bind socket 端口就可以搞,Node.js 提供了。
是否有简单优雅的实现方案?
否,没人写,所以需要自己动手。
2 楼已经说的很完整了。
jack4536251
2023-05-23 20:09:08 +08:00
@ysc3839 nodejs 启动服务只能用自己的 http server 吧
ysc3839
2023-05-23 20:13:38 +08:00
@jack4536251 什么意思?外部程序就是指反向代理,Node.js 开两个端口
documentzhangx66
2023-05-23 22:36:41 +08:00
你需要的是 nginx 。

nginx 本身就是 http server 。

然后搜 nginx as tcp proxy 来处理 tcp 。
leonshaw
2023-05-23 22:56:39 +08:00
可以,我之前写过一个,正常使用还行,但是没办法优雅。主要问题是什么叫“第一条数据”,第一次 recv 收到的数据量不够怎么处理,怎么定义协议特征。
voidmnwzp
2023-05-23 23:00:53 +08:00
直接都用 http 根据 body 或者 header 的标志判断是否 upgrade 跟 websocket 协议类似 如果是 tcp 则走 tcp socket
johnhom
2023-05-24 08:37:03 +08:00
其实 tcp 和 http 是可以监听同一个端口的,但是要分成 ipv4 和 ipv6
weijancc
2023-05-24 09:32:23 +08:00
@johnhom #9 各自监听不同的 ip 就可以了
johnhom
2023-05-25 22:19:46 +08:00
@weijancc 只能监听本机的 ip 的,所以可以监听 127.0.0.1 的 8080 端口,和:::1 的 8080 端口

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/942343

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX