WebSocket心跳机制

简介: WebSocket心跳机制

WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。


1、创建webSocket

 // Create WebSocket connection.
 const socket = new WebSocket('ws://localhost:8080');


2、websocket事件


事件 事件处理程序 描述
open Socket.onopen 连接建立时触发
message Socket.onmessage 客户端接收服务端数据时触发
error Socket.onerror 通信发生错误时触发
close Socket.onclose

连接关闭时触发


3、WebSocket方法


方法 描述
Socket.send() 使用连接发送数据
Socket.close() 关闭连接


WebSocket的心跳机制


问题:

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

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


心跳重连机制

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

⼼跳机制是客户端每隔⼀段时间会向服务端发送⼀个数据包,告诉服务端自己还活着,同时客户端会根据服务端是否会回传⼀个数据包来确定服务端是否还活着。

如果客户端没有收到回复,表示websocket断开连接或者网络出现问题,就需要重连


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);
             },
         }
     }
相关文章
|
6天前
|
前端开发
websocket的心跳机制
websocket的心跳机制
95 2
|
8月前
|
移动开发 HTML5
WebSocket心跳机制
WebSocket心跳机制
80 0
websocket封装带心跳和重连机制(vue3+ts+vite)
websocket封装带心跳和重连机制(vue3+ts+vite)
1602 0
|
6天前
|
前端开发 Java Spring
WebSocket心跳机制(笔记大全)
WebSocket心跳机制(笔记大全)
477 0
|
前端开发
WebSocket使用及优化(心跳机制与断线重连)
WebSocket使用及优化(心跳机制与断线重连)
1777 0
WebSocket使用及优化(心跳机制与断线重连)
|
网络协议 前端开发 安全
websocket和http的瓜葛以及websocket协议实现
websocket和http的瓜葛以及websocket协议实现
websocket和http的瓜葛以及websocket协议实现
|
JavaScript
js实现websocket实例
js实现websocket实例
198 0
|
消息中间件 网络协议 前端开发
SpringBoot轻松整合WebSocket,实现Web在线聊天室
前面为大家讲述了 Spring Boot的整合Redis、RabbitMQ、Elasticsearch等各种框架组件;随着移动互联网的发展,服务端消息数据推送已经是一个非常重要、非常普遍的基础功能。今天就和大家聊聊在SpringBoot轻松整合WebSocket,实现Web在线聊天室,希望能对大家有所帮助。
SpringBoot轻松整合WebSocket,实现Web在线聊天室
|
网络协议 Linux 网络安全
php实现websocket实时消息推送
php实现websocket实时消息推送
438 0
php实现websocket实时消息推送
|
JavaScript 前端开发 Python
Python编程:tornado实现WebSocket通讯
以下实例有点像广播通讯,支持多个客户端连接 代码参考别人的,稍微做了一点点修改 服务器端 websocket_demo.py
104 0
Python编程:tornado实现WebSocket通讯