V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqoo
V2EX  ›  程序员

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

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

    程序中有两个服务:一个是普通的 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   ·   实用小工具   ·   2649 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:05 · PVG 14:05 · LAX 22:05 · JFK 01:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.