Websocket心跳机制与vue2的响应式原理与缺陷

websocket实时传输中心脏跳动的机制或者说原理

WebSocket心跳机制

1、创建webSocket

arduino 复制代码
// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');

2、websocket事件

3、WebSocket方法

WebSocket的心跳机制

问题:

(1)websocket在连接后,如果长时间服务端和客户端不发消息,服务端会把websocket给断开。

(2)存在网络忽然断开的情况,这时服务器端并没有触发onclose的事件。服务器会继续向客户端发送多余的信息,这些数据会丢失。

心跳重连机制

为了解决上面的问题,就需要⼀种机制来检测客户端和服务端是否处于正常的连接状态。因此就有了websocket的心跳机制。

⼼跳机制是客户端每隔⼀段时间会向服务端发送⼀个数据包,告诉服务端自己还活着,同时客户端会根据服务端是否会回传⼀个数据包来确定服务端是否还活着。
如果客户端没有收到回复,表示websocket断开连接或者网络出现问题,就需要重连。

javascript 复制代码
const socket = new WebSocket('ws://localhost:8080'); // WebSocket 建立连接
const heartCheck = initHeartCheck();// 初始化心跳检测对象

// WebSocket建立连接成功
socket.addEventListener('open', function (event) {
  heartCheck.start();// 启动心跳检测
  socket.send('Hello Server!');
});
// WebSocket接受到服务端消息
socket.addEventListener('message',function(event){
  heartCheck.start();// 启动心跳检测
})
// WebSocket 连接被关闭
socket.addEventListener('close',function(event){
  heartCheck.reset();// 启动心跳检测
})
// WebSocket 连接因错误而关闭
socket.addEventListener('error',function(event){
  heartCheck.reset();// 启动心跳检测
})

function initHeartCheck() {
        return {
            timeout: 2 * 1000, // 每2s向服务端发送一次消息
            serverTimeout: 10 * 1000, // 10s收不到服务端消息算超时
            timer: null,
            serverTimer: null,
            reset() { // 心跳检测重置
                clearTimeout(this.timer);
                clearTimeout(this.serverTimer);
                this.timer = null;
                this.serverTimer = null;
                return this;
            },
            start() { // 心跳检测启动
                this.reset();
                this.timer = setTimeout(() => { 
                    socket.send('ping'); // 定时向服务端发送消息
                    if (!this.serverTimer) {
                        this.serverTimer = setTimeout(() => {
                            // 关闭连接触发重连
                           console.log(new Date().toLocaleString(), "not received pong, close the websocket");
                          socket.close(); //关闭websocket或根据业务需求去重连 
                        }, this.serverTimeout);
                    }
                }, this.timeout);
            },
        }
    }

vue2实现响应式的原理与缺陷

原理:

vue2是通过Object.defineProperty进行数据劫持,并且通过订阅发布模式中的get和set进行响应,一旦有人读取数据会触发get函数,修改数据的时候则会触发set函数。

缺陷:

vue2响应式原理的缺陷:无法检测到引用数据类型,比如数组,对象中内部长度的变化,也无法通过角标的形式去追踪。

相关推荐
薛定谔的算法37 分钟前
Vue.js 条件渲染与列表渲染详解:原理、用法与最佳实践
前端·vue.js·前端框架
_前端小李_1 小时前
关于预检请求
前端
李游Leo1 小时前
JavaScript事件机制与性能优化:防抖 / 节流 / 事件委托 / Passive Event Listeners 全解析
开发语言·javascript·性能优化
复苏季风1 小时前
Vue3 小白的疑惑:为什么用 const 定义的变量还能改?
前端·javascript·vue.js
扉川川1 小时前
File和Blob对象的区别
javascript
Mintopia1 小时前
在 Next.js 中接入 Google Analytics 与 PostHog —— 一场“数据偷窥”的艺术演出
前端·javascript·next.js
遂心_1 小时前
React useState:20分钟彻底掌握这个让你"状态满满"的Hook
前端·javascript·react.js
月亮慢慢圆1 小时前
Web Animation API
前端
Mintopia1 小时前
AIGC驱动的Web界面设计:技术逻辑与用户体验平衡
前端·javascript·aigc
盏茶作酒291 小时前
浅拷贝和深拷贝
前端·javascript