NodeJS 中 TCP 和 HTTP 服务可复用同个端口吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
iqoo
V2EX    程序员

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

  •  
  •   iqoo 2023-05-23 18:19:18 +08:00 2286 次点击
    这是一个创建于 925 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    nginx 本身就是 http server 。

    然后搜 nginx as tcp proxy 来处理 tcp 。
    leonshaw
        7
    leonshaw  
       2023-05-23 22:56:39 +08:00
    可以,我之前写过一个,正常使用还行,但是没办法优雅。主要问题是什么叫“第一条数据”,第一次 recv 收到的数据量不够怎么处理,怎么定义协议特征。
    voidmnwzp
        8
    voidmnwzp  
       2023-05-23 23:00:53 +08:00 via iPhone
    直接都用 http 根据 body 或者 header 的标志判断是否 upgrade 跟 websocket 协议类似 如果是 tcp 则走 tcp socket
    johnhom
        9
    johnhom  
       2023-05-24 08:37:03 +08:00
    其实 tcp 和 http 是可以监听同一个端口的,但是要分成 ipv4 和 ipv6
    weijancc
        10
    weijancc  
       2023-05-24 09:32:23 +08:00
    @johnhom #9 各自监听不同的 ip 就可以了
    johnhom
        11
    johnhom  
       2023-05-25 22:19:46 +08:00
    @weijancc 只能监听本机的 ip 的,所以可以监听 127.0.0.1 的 8080 端口,和:::1 的 8080 端口
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:45 PVG 05:45 LAX 13:45 JFK 16:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86