• 请不要在回答技术问题时复制粘贴 AI 生成的内容
iqoo
V2EX  ›  程序员

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

  •  
  •   iqoo · May 23, 2023 · 2494 views
    This topic created in 1085 days ago, the information mentioned may be changed or developed.

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

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

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

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

    nginx 本身就是 http server 。

    然后搜 nginx as tcp proxy 来处理 tcp 。
    leonshaw
        7
    leonshaw  
       May 23, 2023
    可以,我之前写过一个,正常使用还行,但是没办法优雅。主要问题是什么叫“第一条数据”,第一次 recv 收到的数据量不够怎么处理,怎么定义协议特征。
    voidmnwzp
        8
    voidmnwzp  
       May 23, 2023 via iPhone
    直接都用 http 根据 body 或者 header 的标志判断是否 upgrade 跟 websocket 协议类似 如果是 tcp 则走 tcp socket
    johnhom
        9
    johnhom  
       May 24, 2023
    其实 tcp 和 http 是可以监听同一个端口的,但是要分成 ipv4 和 ipv6
    weijancc
        10
    weijancc  
       May 24, 2023
    @johnhom #9 各自监听不同的 ip 就可以了
    johnhom
        11
    johnhom  
       May 25, 2023
    @weijancc 只能监听本机的 ip 的,所以可以监听 127.0.0.1 的 8080 端口,和:::1 的 8080 端口
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   932 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 21:21 · PVG 05:21 · LAX 14:21 · JFK 17:21
    ♥ Do have faith in what you're doing.