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

多开如何保持一个 ws 连接呢?

  •  
  •   firhome · 2022-07-31 08:35:35 +08:00 · 3164 次点击
    这是一个创建于 854 天前的主题,其中的信息可能已经有所发展或是发生改变。
    页面需要推送提醒,接入了 webscoket

    但是问题来了,如果用户新窗口打开页面 又会创建一个 webscoket 连接,后端说最大连接数有限制。

    请问如何让用户 多开的情况下 只保持一个连接呢?


    我想到的办法是浏览器端 通过 BroadcastChannel 来实现。已经创建了 ws ,新窗口打开后就不创建了。通过 BroadcastChannel 来使得窗口直接数据交互

    不知道这样是否可行?
    19 条回复    2022-08-01 11:03:52 +08:00
    monstervivi
        1
    monstervivi  
       2022-07-31 08:44:24 +08:00 via iPhone
    使用缓存,key = uniqueId (保证每个用户对应一个如用户 ID), value = 连接。
    BBCCBB
        2
    BBCCBB  
       2022-07-31 08:45:11 +08:00
    后端来控制, 根据 uid/唯一标识关掉之前的 /限制新连接创建
    monstervivi
        3
    monstervivi  
       2022-07-31 08:46:44 +08:00 via iPhone
    @monstervivi 这里说的是后端建立 ws 连接的逻辑
    li746224
        4
    li746224  
       2022-07-31 08:57:01 +08:00 via iPhone
    浏览器指纹
    zhuweiyou
        5
    zhuweiyou  
       2022-07-31 09:17:23 +08:00
    应该解决 "后端说最大连接数有限制" 这个问题, 不然用户多了不一样挂?
    C603H6r18Q1mSP9N
        6
    C603H6r18Q1mSP9N  
       2022-07-31 09:18:23 +08:00
    我们是页面隐藏 ws 关、显示 ws 重连,简单好用
    wobuhuicode
        7
    wobuhuicode  
       2022-07-31 09:33:13 +08:00
    最简单的的做法就是前端 cookies 带个 ID 就好了
    firhome
        8
    firhome  
    OP
       2022-07-31 09:57:36 +08:00
    @BBCCBB 这样会有问题吧。 那样 新窗口的页面连接了。 旧的页面 就不连了? 那用户关闭新窗口 旧的通知就无法触达了
    firhome
        9
    firhome  
    OP
       2022-07-31 09:58:14 +08:00
    @shanghai1998 能具体说说吗? 也是通过我说的那个 BroadcastChannel 来实现的吧
    westoy
        10
    westoy  
       2022-07-31 10:30:22 +08:00
    简单粗暴点好, 直接随机一个泛解析的二级域名
    oott123
        11
    oott123  
       2022-07-31 10:33:06 +08:00
    你自己都说 BroadcastChannel 了,这方案应该是对后端和对用户来说体验都最好的,只看你乐不乐意写一吨代码来换这个最好了。
    learningman
        12
    learningman  
       2022-07-31 11:07:39 +08:00 via Android
    能不能用这个
    https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_event
    把不可见的窗口的连接关掉,一般来说用户最顶层只有一个窗口,也就变相实现了
    huangzhiyia
        13
    huangzhiyia  
       2022-07-31 11:40:35 +08:00
    激活页面保持 ws 连接,非激活页面暂停或者断开 ws 连接。在前端抽象出一层消息处理 API ,比如 ws 收到消息往 localstorage 写消息,其他页面定时( 1s )从 localstorage 取消息。
    iseki
        14
    iseki  
       2022-07-31 11:47:18 +08:00 via Android
    开个 SharedWorker 行不行
    wgjtyu
        15
    wgjtyu  
       2022-07-31 11:49:08 +08:00
    如果说的多开是指一个浏览器的多个 tab ,可以试试 SharedWorker 。https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker
    westoy
        16
    westoy  
       2022-07-31 11:53:28 +08:00
    @wgjtyu

    这坑我踩过, 移动端支持一塌糊涂........
    kongkx
        17
    kongkx  
       2022-07-31 13:09:41 +08:00 via iPhone
    worker 或者 broadcast channel 甚至 localstorage 都可以试试。 反正都是解决 tab 之间的通讯,然后管理连接的问题
    des
        18
    des  
       2022-07-31 13:21:59 +08:00 via iPhone
    @wgjtyu 我记得 SharedWorker 是不推荐使用了?
    monexus
        19
    monexus  
       2022-08-01 11:03:52 +08:00
    目前只有 Shared Worker 能很好的满足这个需求
    GitHub 也是用 Shared Worker 建立 WebScoket
    除了手机上兼容差点,可以 fallback 到原本的方式

    @des 那是之前实现有 bug ,停用了一段时间而已
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2497 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:27 · PVG 10:27 · LAX 18:27 · JFK 21:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.