V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
mentalidade
V2EX  ›  程序员

求教 websocket 怎么判断浏览器断开的情况?

  •  
  •   mentalidade · Dec 11, 2017 · 7162 views
    This topic created in 3059 days ago, the information mentioned may be changed or developed.

    客户端请求之后,间隔 3 或者 5 秒查询 es,如果有错误消息就使用 websocket 推送到客户端。 使用的github.com/gorilla/websocket,但是服务端循环加 sleep 请求且推送,如果 客户端异常断开,服务端还没法停止。

    需要在每次循环里面检测一次客户端连接是否正常这种吗?

    14 replies    2017-12-11 16:58:51 +08:00
    jatesun
        1
    jatesun  
       Dec 11, 2017
    没存储 sessionid 吗?可以维护个 session 的 map,每次推送的时候查看状态是否开启,开启就推送
    mentalidade
        2
    mentalidade  
    OP
       Dec 11, 2017
    @jatesun 没有,用的是 token
    bilberry
        3
    bilberry  
       Dec 11, 2017
    加一个回传机制,server 推送后,客户端回传一个消息,当 server 多次推送后,没有收到回传消息,就删除这个客户端
    zgx030030
        4
    zgx030030  
       Dec 11, 2017 via iPhone
    心跳包?
    phy25
        5
    phy25  
       Dec 11, 2017 via Android
    不懂 Go,但我在 Demo 里看到有 IsCloseError 和 IsUnexpectedCloseError,这个不就是了嘛。服务器肯定能自主检测到 WebSocket 断了的。
    enenaaa
        6
    enenaaa  
       Dec 11, 2017
    websocket 是长连接。 如果断开, 服务端会得到一个连接断开的事件。
    mentalidade
        7
    mentalidade  
    OP
       Dec 11, 2017
    @bilberry
    @zgx030030
    @phy25
    @enenaaa 好,谢谢大佬们,我去看看
    mentalidade
        8
    mentalidade  
    OP
       Dec 11, 2017
    @bilberry 这个和我准备推送的时候发一个 ping 检测一下是否正常连接
    hantsy
        9
    hantsy  
       Dec 11, 2017
    websocket connect/disconnect 好像都基于事件的一些接口,直接实现就行了。这个 Java 标准和 Spring 都可以监控相应事件。
    zacard
        10
    zacard  
       Dec 11, 2017
    websocket 应该有直接的事件
    keepfun
        11
    keepfun  
       Dec 11, 2017
    客户端和服务器端 应该一直有 ping pong 这种心跳来维持在线和判断在线.
    dangyuluo
        12
    dangyuluo  
       Dec 11, 2017
    websocket 服务端会收到这个事件的,从 clients list 中删除就可以了。
    killerv
        13
    killerv  
       Dec 11, 2017
    服务端可以直接收到的
    zado
        14
    zado  
       Dec 11, 2017
    主动断开连接或正常关闭页面时浏览器会发送一个断开事件。如果是异常断开,那要看服务端 Socket 的 KeepAlive 参数是设置的是多长时间,要等到超时才能收到断开事件。如果应用层不能设置 KeepAlive 参数,那只能自己加心跳来及时处理异常情况。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1481 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 17:06 · PVG 01:06 · LAX 10:06 · JFK 13:06
    ♥ Do have faith in what you're doing.