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

WebSocket 客户端连接不上和掉线的问题以及解决方案

  •  
  •   jonychen1 · 2018-07-18 16:33:57 +08:00 · 1521 次点击
    这是一个创建于 2321 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到最近有很多人在 blog 上问关于 WebSocket 客户端连接和掉线的问题,有一部分我以前也遇到过,在这里我罗列了一些我以前遇到过的问题和其他简单的 WebSocket 服务。

    Q1 客户端连接不上的问题 这个问题我遇到的基本集中在后端,遇到的话需要收集日志进行分析,首先要查看是因为什么原因出现问题的,不过这种情况下多半会出现 Exception,从 Exception 着手分析问题即可。

    Q2 1 客户端掉线问题 这里所指的客户端掉线的问题是指客户端非正常掉线。有的时候会出现 Exception,通过处理 Exception 即可关闭连接,有的时候像客户端突然网络离线的情况下,这个时候后台没有收到客户端发来的 close frame,会认为这个客户端还是处在在线的情况。那这个问题可以通过心跳包的问题解决。也可以通过客户端向服务器发心跳包,也可以服务器发送心跳包至客户端。我们最终采用的方案是客户端向服务端发送心跳包,服务端收到心跳包后会检测当前 websocket session 队列中是否存在同属性的 websocket session,有的话关闭以前的 session 即可。我个人认为还是服务端像客户端发送心跳包好一些,但这样做要注意性能问题。

    Q3 websocket 连接后 1 分钟自动断开关闭 这是因为 websocket 长连接有默认的超时时间( 1 分钟,由 proxy_read_timeout 决定),就是超过一定的时间没有发送任何消息,连接会自动断开。解决办法就是让浏览器每隔一定时间(要小于超时时间)发送一个心跳。代码如下: window.setInterval(function(){ //每隔 5 秒钟发送一次心跳,避免 websocket 连接因超时而自动断开 var ping = {"type":"ping"}; ws.send(JSON.stringify(ping)); },5000);

    Q4 能收到客户端消息,后台也显示发送,但是客户端收不到 这个问题经我个人观察和猜测,应该是 websocketsession 没有成功关闭或者成功关闭但是和一个 websocketsession 对应多个 session 有关,因为我把上面的问题解决了之后,这个问题也没出现过了。

    最近因为工作需求较多,又有新项目要进来,项目周期太紧了,经过团队商量,自己开发 WebSocket 这一块,要做稳定成本太高了,所以我们决定使用第三方的 WebSocket 服务,经过我们对比多个第三方服务,最终发现了一个 Java websocket 神器叫 GoEasy,相比较其他的三方,我觉得这个上手更加简单,对各种浏览器的兼容也非常好。用到现在也没有什么问题,你们有兴趣的可以去试一下。 网址: http://www.goeasy.io 希望我遇到的问题以及解决方案对你们有所帮助。

    ookkxw
        1
    ookkxw  
       2018-07-18 16:42:01 +08:00 via iPhone
    mark 有空看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1912 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:02 · PVG 08:02 · LAX 16:02 · JFK 19:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.