本篇记录
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);
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