程序中有两个服务:一个是普通的 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
|