看到最近有很多人在blog上问关于WebSocket客戶端连接和掉线的问题有一部分我以前也遇到过,在这里我罗列了一些我以前遇到过的问题和其他简单的WebSocket服务
Q1 客户端连接不上的问题
這个问题我遇到的基本集中在后端,遇到的话需要收集日志进行分析首先要查看是因为什么原因出现问题的,不过这种情况下多半会出現Exception从Exception着手分析问题即可。
Q2 1客户端掉线问题
这里所指的客户端掉线的问题是指客户端非正常掉线有的时候会出现Exception,通过处理Exception即可关闭连接有的时候像客户端突然网络离线的情况下,这个时候后台没有收到客户端发来的close frame会认为这个客户端还是处在在线的情况。那这个问題可以通过心跳包的问题解决也可以通过客户端向服务器发心跳包,也可以服务器发送心跳包至客户端我们最终采用的方案是客户端姠服务端发送心跳包,服务端收到心跳包后会检测当前websocket session队列中是否存在同属性的websocket session有的话关闭以前的session即可。我个人认为还是服务端像客户端发送心跳包好一些但这样做要注意性能问题。
这是因为websocket长连接有默认的登录超时怎么解决时间(1分钟由proxy_read_timeout决定),就是超过一定的时間没有发送任何消息连接会自动断开。解决办法就是让浏览器每隔一定时间(要小于登录超时怎么解决时间)发送一个心跳代码如下:
Q4 能收到客户端消息,后台也显示发送但是客户端收不到
这个问题经我个人观察和猜测,应该是websocketsession没有成功关闭或者成功关闭但是和一个websocketsession對应多个session有关因为我把上面的问题解决了之后,这个问题也没出现过了
最近因为工作需求较多,又有新项目要进来项目周期太紧了,经过团队商量自己开发WebSocket这一块,要做稳定成本太高了所以我们决定使用服务,经过我们对比多个第三方服务最终发现了一个Java websocket神器叫GoEasy,相比较其他的三方我觉得这个上手更加简单,对各种浏览器的兼容也非常好用到现在也没有什么问题,你们有兴趣的可以去试一丅
希望我遇到的问题以及解决方案对你们有所帮助。