您的位置:首页 > Web前端

教你如何快速解决后台服务重启后,前端webSocketz中断的问题

2020-08-10 19:31 861 查看

后端服务器宕机或重启时,前端Vue 不断重连webSocket的解决办法:

问题重现:后台服务重启时,前端连接的webScoket就断了,需要刷新页面才能重新建立连接,这样用户体验的效果不好,而且有些业务场景,比如硬件监控系统大屏这些是不允许刷新页面的,所以需要前端发现webSocket断了,然后自己不断去发起连接。

解决思路:在webSocket的生命周期onclose和onerror时调用重连函数,增加心跳检测。

解决方案:

1.创建变量

[code]data() {
return {
// webSocket对象
webSocket: null,
// webSocketUrl地址
webSocketUrl: null,
//连接标识 避免重复连接
isConnect: false,
//断线重连后,延迟5秒重新创建WebSocket连接  rec用来存储延迟请求的代码
rec: null,
// 心跳发送/返回的信息
checkMsg: {hhh: 'heartbeat'},
//每段时间发送一次心跳包 这里设置为20s
timeout: 20000,
//延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
timeoutObj: null,
}
}

2.创建webSocket连接

[code]//创建webSocket连接
createWebSocket() {
let that = this;
that.webSocket = new WebSocket(that.webSocketUrl);
that.initWebsocket();
}

3.初始化webSocket连接

[code]initWebsocket() {
let that = this;
//WebSocket连接建立之后会调用onopen方法
that.webSocket.onopen = that.websocketonopen;
//当websocket收到服务器发送的信息之后  会调用onmessage方法
that.webSocket.onmessage = that.websocketonmessage;
//当websocket因为各种原因(正常或者异常)关闭之后,会调用onclose方法
that.webSocket.onclose = that.websocketclose;
//当websocket因为异常原因(比如服务器部署、断网等)关闭之后,会调用onerror方法
//在onerror中需要调用reConnect方法重连服务器
that.webSocket.onerror = that.websocketonerror;
}

4.websocketonopen函数

[code]websocketonopen() {
let that = this;
console.log('open');
//连接建立后修改标识
that.isConnect = true;
// 建立连接后开始心跳
// 因为nginx一般会设置例如60s没有传输数据就断开连接  所以要定时发送数据
that.timeoutObj = setTimeout(function() {
if (that.isConnect)
that.webSocket.send(that.checkMsg);
}, that.timeout);
}
5.websocketonerror函数

websocketonerror() {
let that = this;
console.log('error');
//连接断开后修改标识
that.isConnect = false;
//连接错误 需要重连
that.reConnect();
}

6.websocketonmessage函数

websocketonmessage(e) {
// 拿到数据,处理自己的业务
let that = this;
console.log(e.data);
//获取消息后 重置心跳
clearTimeout(that.timeoutObj);
that.timeoutObj = setTimeout(function() {
if (that.isConnect)
that.webSocket.send(that.checkMsg);    },
that.timeout);
}

7.websocketclose函数

websocketclose() {
let that = this;
console.log('close');
//连接断开后修改标识
that.isConnect = false;
//连接错误 需要重连
that.reConnect();
}
8.定义重连函数

reConnect() {
let that = this;
console.log('尝试重新连接');
//如果已经连上就不在重连了
if (that.isConnect) {
return;
}
clearTimeout(that.rec);
// 延迟5秒重连  避免过多次过频繁请求重连
that.rec = setTimeout(function() {
that.createWebSocket();    }, 5000);
}

最后

如果你现在也想学习前端开发技术,在入门学习前端的过程当中有遇见任何关于学习方法,学习路线,学习效率等方面的问题,推荐你加入一个前端qq学习交流裙:1142648440里面也整理了一些前端学习手册,前端面试题,前端开发工具,PDF文档书籍教程,需要的话都可以自行来获取下载。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: