多开如何保持一个 ws 连接呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 成的内容
firhome
V2EX    程序员

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

  •  
  • &bsp; firhome 2022-07-31 08:35:35 +08:00 3564 次点击
    这是一个创建于 1168 天前的主题,其中的信息可能已经有所发展或是发生改变。
    页面需要推送提醒,接入了 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 连接的逻辑
    MoozLee
        4
    MoozLee  
       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     Solana     980 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 23:13 PVG 07:13 LAX 16:13 JFK 19:13
    Do have faith in what you're doing.
    ubao 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