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

342 天前
 iqoo

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

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

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

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

nginx 本身就是 http server 。

然后搜 nginx as tcp proxy 来处理 tcp 。
leonshaw
342 天前
可以,我之前写过一个,正常使用还行,但是没办法优雅。主要问题是什么叫“第一条数据”,第一次 recv 收到的数据量不够怎么处理,怎么定义协议特征。
voidmnwzp
342 天前
直接都用 http 根据 body 或者 header 的标志判断是否 upgrade 跟 websocket 协议类似 如果是 tcp 则走 tcp socket
johnhom
341 天前
其实 tcp 和 http 是可以监听同一个端口的,但是要分成 ipv4 和 ipv6
weijancc
341 天前
@johnhom #9 各自监听不同的 ip 就可以了
johnhom
340 天前
@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