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

websocket 的 ping/pong 标准是需要服务器主动发 ping?

  •  
  •   dyllen · 2023-11-06 17:20:13 +08:00 · 971 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    websocket 里面 ping/pong 机制标准规定就是服务端发 ping ,客户端响应 pong 吗?

    6 条回复    2023-11-07 00:18:00 +08:00
    darkengine
        1
    darkengine  
       2023-11-06 17:44:30 +08:00
    https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#pings_and_pongs_the_heartbeat_of_websockets

    没有这么个规定。我觉得 client 端发也是合理的,当给服务器发 ping 没收到 pong 时(需要重试几次),可以考虑重新发起连接服务器了。
    ellermister
        2
    ellermister  
       2023-11-06 18:40:35 +08:00
    JS 客户端没有 ping 的包,只能发个字符串,服务端都不用处理,连接就能维持。

    内网环境啥都不发可以一直维持,公网环境,20s 发一次最保险,不然运营商就给你掐链接了。
    dyllen
        3
    dyllen  
    OP
       2023-11-06 19:08:18 +08:00
    @darkengine
    @ellermister 好像是没有这个规定,我用的服务端 websocket 库实现是主动给客户端浏览器发 ping 的,浏览器会有 pong 的回应,浏览器端不需要自己处理 pong ,而且浏览器客户端也没有可以发 ping 帧的接口。
    darkengine
        4
    darkengine  
       2023-11-06 20:39:38 +08:00
    原来是浏览器啊, 我们的是 app 端主动 ping, 因为移动网络很容易掉线, 所以需要有这个机制让 app 尝试重连.
    rabbbit
        5
    rabbbit  
       2023-11-06 20:43:18 +08:00
    一般都是 app 端主动发,随便发个啥都行,自己商量。
    30s 发一次,服务器 2 分钟没收到主动断开。
    lizhenda
        6
    lizhenda  
       2023-11-07 00:18:00 +08:00 via iPhone
    没有标准,哪边发都可以。不过如果只是浏览器环境(特别是 Chrome)可以考虑服务端主动发 ping 因为浏览器会自动回 pong ,这时客户端就可以不用处理心跳了。否则,网页端需要自己模拟 ping 消息包。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:35 · PVG 00:35 · LAX 08:35 · JFK 11:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.