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);
             },
         }
     }
相关文章
|
7月前
|
前端开发
websocket的心跳机制
websocket的心跳机制
372 3
|
移动开发 HTML5
WebSocket心跳机制
WebSocket心跳机制
197 0
websocket封装带心跳和重连机制(vue3+ts+vite)
websocket封装带心跳和重连机制(vue3+ts+vite)
1918 0
|
4月前
|
前端开发 JavaScript API
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
【8月更文挑战第17天】赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
133 3
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
|
5月前
|
JavaScript 前端开发 网络协议
从理论到实践:全面剖析Python Web应用中的WebSocket实时通信机制
【7月更文挑战第17天】WebSocket在实时Web应用中扮演重要角色,提供全双工通信,减少延迟。本文详述了Python中使用`websockets`库创建服务器的步骤,展示了一个简单的echo服务器示例,监听8765端口,接收并回显客户端消息。客户端通过JavaScript与服务器交互,实现双向通信。了解WebSocket的握手、传输和关闭阶段,有助于开发者有效利用WebSocket提升应用性能。随着实时需求增长,掌握WebSocket技术至关重要。
324 6
|
5月前
WebSocket 心跳机制如何实现
WebSocket 心跳机制如何实现
71 0
|
7月前
|
前端开发 Java Spring
WebSocket心跳机制(笔记大全)
WebSocket心跳机制(笔记大全)
1058 0
|
前端开发
WebSocket使用及优化(心跳机制与断线重连)
WebSocket使用及优化(心跳机制与断线重连)
2701 0
WebSocket使用及优化(心跳机制与断线重连)
|
5月前
|
前端开发 网络协议 JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
2月前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
495 1