本篇记录 WebSocket :用WebSocket实现推送你必须考虑的几个问题 onError错误用法导致的一个bug(同一种client类型只能登陆一个设备,具体代码可以参见 : http://download.csdn.net/download/shangmingtao/9920532 ) ,代码:

Close @OnClose public void onClose (@ PathParam ("userId") String userId, Session session) { log.info( "[WebSocketServer] Close Connection : userId = " + userId); WebSocketUtils.remove(userId); Error @OnError public void onError (@ PathParam ("userId") String userId, Throwable throwable, Session session) { log.info( "[WebSocketServer] Connection Exception : userId = " + userId + " , throwable = " + throwable.getMessage()); WebSocketUtils.remove(userId); //清除userId和session对应关系

WebSocket连接流程图:

bug复现条件 :

client端连接上WebSocket后断开网络 ->打开网络 ->重新连接.

bug现象:

服务端抛出TCP reset异常, reset异常触发onError回调方法, 上述代码中onError中会清除userId和session的对应关系.但实际清除的并不是旧链接的session和userId的对应关系.因为我们用map或者redis存储userId和session对应关系时是一个K-V存储,新的会覆盖旧的.

bug原因:

断开网络前:
这里写图片描述

断开网络后:
这里写图片描述

造成RST包的原因 :

  • 端口未打开
  • 请求超时
  • 提前关闭 (当本端断开连接(不论什么原因TCP四次挥手未到达对端),另一端发送消息到本端会触发本端回复RST包),这也是本bug原因.至于[PSH,ACK]具体是那条消息的ACK我没有深究.

解决思路&方案:

很多网上WebSocket服务端代码对于生产环境应用来讲都误导了大家,onClose方法和onError方法处理一模一样.但实际这两个方法分别是不同情况的回调.一个是关闭一个是异常.虽然很多时候触发onError方法后会触发onClose.比如网络异常导致连接异常,然后ws关闭了连接.但是也有一些情况是仅触发onError方法.比如上边的server端close掉连接,然后接到RST包这种情况.
所以我们的处理方案是在onError回调中仅打印一条日志或者针对不同的异常写逻辑.无论怎么处理都不可以在onError方法中接触userId和session之间的对应关系.

目录:目录项目背景WebSocket连接流程图bug复现条件 bug现象bug原因解决思路方案项目背景本篇记录WebSocket :用WebSocket实现推送你必须考虑的几个问题 onError错误用法导致的一个bug(同一种client类型只能登陆一个设备,具体代码可以参见 : http://download.csdn.net/download/shangmingtao/99205
阅读本文章前请先了解 WebSocket WebSocket 在连接关闭的情况下会触发onclose事件,在链接异常的情况下会触发on error 事件。而在弱网条件下,onclose事件触发的灵敏度却不高,往往已经断网很久了才触发onclose事件,前端又去进行重连操作,对实时界面的展示不友好。所以,本文将介绍心跳重连机制来改善这一现象。 心跳重连机制:前端在WS连接成功的情况下,开始执行心跳函数,首先向服务器端发送‘ping’信息,服务器内若收到信息则会返回’pong’信息。在一定时间内,前端收
@ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个 websocket 服务器端。注解的值将被用于监听用户连接的终端访问URL地址。 onOpen 和 onClose 方法分别被@OnOpen和@OnClose 所注解。这两个注解的作用不言自明:他们定义了当一个新用户连接和断开的时候所调用的方法。 onMessage 方法被@OnMessage所注解
最近做项目,用到 websocket 来做消息的实时推送。在做这个项目之前, websocket 的相关内容没有接触过,只限于知道有这个东西。对于这个 websocket ,一切都是从零开始。所以做这个项目前有去搜索了一些关于 websocket 的技术知识。 websocket 的基本事件有onopen、onmessage、on error 、onclose这四个事件,onopen是...
此异常非彼异常,标题所说的异常是业务上的异常。 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理。 因为需要服务端主动向客户端发送消息,所以很容易的就想到了用 WebSocket 来实现这一功能。 WebSocket 就不做介绍了,上链接:https://developer.mozilla.org/zh-CN/docs/Web/API/ WebSocket 前端略微复杂,需要在一张位置分布图上进行鼠标描 什么是 WebSocket webSocket 是一种网络通讯协议,与Htpp协议的区别是,Htpp通信只能由客户端发起,服务端响应的这种单向通信;而 webSocket 最大的特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,实现客户端与服务端的双向通讯。 WebSocket API WebSocket .onopen 连接成功的回调 WebSocket .onclose 连接关闭后的回调 WebSocket .on error 连接失败后的回调
本文为joshua317原创文章,转载请注明:转载自joshua317博客HTTPS站点使用 WebSocket 错误 及解决方案 - joshua317的博客 HTTPS站点使用 WebSocket 错误 及解决方案 1.在https下使用ws,提示不安全 第一个问题:在https站点下,使用ws://im.joshua317.com报错,报错信息如下: Mixed Content: The page at 'https://www.joshua317.com/1.html' was loaded ..
最近发现 webSocket 连接,经常自动断开,看了晚上的一些文章,很多说是Nginx的问题,但是不想改Nginx因为怕影响其他系统,而且不一定有效,因此决定给 webSocket 加一个心跳机制: 1:先在服务端判断消息是不是心跳检测消息,是的话,原封不动将消息传给客户端即可: if("heartCheck".equals(jsonObject.getString("heartCheck"))){// 心跳检测的消息 sendMessage(message); retur