前端实现websocket的应用场景以及逻辑实现

2023-09-17 16:20:32

前端实现websocket的应用场景以及逻辑实现

前端在基础业务逻辑外,根据具体的业务需求还可以实现更复杂的交互逻辑,如:

  • 数据同步:WebSocket 可用于实时更新数据,当服务器端数据发生变化时,通过 WebSocket 将变化的数据推送给前端,以保持数据的实时同步。
  • 聊天功能:使用 WebSocket 实现实时聊天功能,前端用户可以发送消息给服务器并接收其他用户发送的消息。
  • 多用户协同编辑:通过 WebSocket 将多个用户之间的编辑操作实时同步,实现多人协同编辑功能。
  • 实时数据展示:将实时数据从服务器传输到前端,展示在页面上,如股票行情、实时天气等。

websocket实现逻辑

  1. 连接建立:

    • 当 WebSocket 连接成功建立时,触发 onopen 事件处理程序。
    • 可以在该处理程序中发送认证信息或其他初始化数据给服务器,例如用户身份验证、订阅特定频道等。
  2. 消息收发:

    • 当收到服务器发送的消息时,触发 onmessage 事件处理程序。
    • 可以解析并处理服务器发送的消息内容,并根据业务需求进行相应的操作,如展示在页面上、更新本地数据等。
    • 如果有需要,可以将某些消息分类,使用不同的处理逻辑。
  3. 错误处理:

    • 当发生错误时,触发 onerror 事件处理程序。
    • 可以在该处理程序中记录日志、展示错误提示信息等。
  4. 连接关闭:

    • 当 WebSocket 连接关闭时,触发 onclose 事件处理程序。
    • 可以在该处理程序中进行必要的清理工作、重新连接尝试或展示状态信息。
  5. 断线重连:

    • 如果由于网络问题等原因导致 WebSocket 连接断开,可以尝试自动进行断线重连。
    • 可以在 onclose 事件处理程序中实现重新连接逻辑,例如等待一定时间后再次尝试连接服务器。
  6. 心跳保持:

    • 如果需要保持 WebSocket 连接的活跃状态,可以实现心跳机制。
    • 可以定时向服务器发送心跳消息,确保连接不会因为长时间无数据传输而断开。

代码示例:

// 创建 WebSocket 连接
const socket = new WebSocket('ws://example.com/socket');

// 连接成功时触发
socket.onopen = function(event) {
  console.log('WebSocket 连接已建立');
  
  // 发送消息到服务器
  socket.send('Hello, server!');
};

// 接收到服务器发送的消息时触发
socket.onmessage = function(event) {
  const message = event.data;
  console.log('收到消息:', message);
  
  // 关闭 WebSocket 连接
  socket.close();
};

// 连接关闭时触发
socket.onclose = function(event) {
  console.log('WebSocket 连接已关闭');
};

// 连接发生错误时触发
socket.onerror = function(error) {
  console.error('WebSocket 错误:', error);
};

首先通过 new WebSocket(url) 创建了 WebSocket 对象,并指定要连接的服务器地址。然后,通过设置 WebSocket 对象的各种事件处理程序来处理不同的事件,例如 onopen 处理连接成功、onmessage 处理接收消息、onclose 处理连接关闭等。在 onopen 处理程序中,可以使用 send() 方法向服务器发送消息。而在 onmessage 处理程序中,可以通过 event.data 获取服务器发送的消息内容。

需要根据实际情况将 ws://example.com/socket 替换为实际的 WebSocket 服务器地址。通常,后端会提供一个 WebSocket 服务器供前端连接。

另外,需要注意的是,WebSocket 连接是异步的,并且在浏览器中只能与支持 WebSocket 协议的服务器进行连接。在开发过程中,可以使用 localhost 或部署在本地的服务器进行测试。

前端实现 WebSocket 的心跳监听

在前端实现 WebSocket 的心跳监听,可以使用定时器定期发送心跳消息来保持连接的活跃状态。以下是一个示例代码:

// 创建 WebSocket 连接
const socket = new WebSocket('ws://example.com/socket');

// 心跳相关变量
let heartbeatTimer = null;
const heartbeatInterval = 30000; // 心跳间隔时间,单位为毫秒

// 连接成功时触发
socket.onopen = function(event) {
  console.log('WebSocket 连接已建立');
  
  // 开始发送心跳消息
  startHeartbeat();
};

// 接收到服务器发送的消息时触发
socket.onmessage = function(event) {
  const message = event.data;
  console.log('收到消息:', message);
  // 处理接收到的消息
  
  // 重置心跳计时器
  resetHeartbeat();
};

// 连接关闭时触发
socket.onclose = function(event) {
  console.log('WebSocket 连接已关闭');
  
  // 停止心跳计时器
  stopHeartbeat();
};

// 连接发生错误时触发
socket.onerror = function(error) {
  console.error('WebSocket 错误:', error);
  
  // 停止心跳计时器
  stopHeartbeat();
};

// 发送心跳消息
function sendHeartbeat() {
  socket.send('heartbeat'); // 发送心跳消息
}

// 开始心跳
function startHeartbeat() {
  heartbeatTimer = setInterval(sendHeartbeat, heartbeatInterval);
}

// 重置心跳计时器
function resetHeartbeat() {
  clearInterval(heartbeatTimer); // 清除旧的计时器
  heartbeatTimer = setInterval(sendHeartbeat, heartbeatInterval); // 开启新的计时器
}

// 停止心跳
function stopHeartbeat() {
  clearInterval(heartbeatTimer);
}

我们创建了一个名为 heartbeatTimer 的定时器变量,并设置了心跳间隔时间为 30 秒(30000 毫秒)。在连接成功建立时,会调用 startHeartbeat() 函数开始发送心跳消息,并在接收到服务器发送的消息时调用 resetHeartbeat() 函数来重置心跳计时器。当连接关闭或发生错误时,会调用 stopHeartbeat() 函数停止心跳计时器。

通过以上实现,定时器会定期调用 sendHeartbeat() 函数发送心跳消息给服务器,以保持连接的活跃状态。每次收到服务器发送的消息时,都会重置心跳计时器,确保连接不会因为长时间无数据传输而断开。

更多推荐

RUST 每日一省:全局变量

Rust中允许存在全局变量。它们一般有两种:常数和静态值。常量我们使用关键字const来创建常量。由于常量未使用关键字let声明,因此在创建它们时必须指定类型。常量只能进行简单赋值,并且没有固定的内存地址,无论它们在何处使用都会被内联。常量不能遮蔽,不能重复定义。也就是说,不存在内层或后面作用域定义的常量去遮蔽外层或前

RocketMQ 源码分析——Producer

文章目录消息发送代码实现消息发送者启动流程检查配置获得MQ客户端实例启动实例定时任务Producer消息发送流程选择队列默认选择队列策略故障延迟机制策略*两种策略的选择技术亮点:ThreadLocal消息发送代码实现下面是一个生产者发送消息的demo(同步发送)主要做了几件事:初始化一个生产者(DefaultMQPro

四、线性支持向量机算法(LinearSVC,Linear Support Vector Classification)(有监督学习)

线性支持向量机,LinearSupportVectorClassification.与参数内核为线性的SVC类似(SVC(kernel=‘linear’)),但使用liblinear而非libsvm实现,因此在选择惩罚和损失函数时更具灵活性,并能更好地扩展到大量样本SVC(kernel=’linear’)和Linear

Meta | 对比解码:进一步提升LLM推理能力

深度学习自然语言处理原创作者:wkk为了改进LLM的推理能力,UniversityofCalifornia联合MetaAI实验室提出将ContrastiveDecoding应用于多种任务的LLM方法。实验表明,所提方法能有效改进LLM的推理能力。让我们走进论文一探究竟吧!论文:ContrastiveDecodingIm

《动手学深度学习 Pytorch版》 6.1 从全连接层到卷积

6.1.1不变性平移不变性(translationinvariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(LeNet)

7.1.1学习表征深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素:缺少的成分:数据数据集紧缺的情况在2010年前后兴起的大数据浪潮中得到改善。ImageNet挑战赛中,ImageNet数据集由斯坦福大学教授李飞飞小组的研究人员开发,利用谷歌图像搜索对分类图片进行预筛选,并利用亚马逊众包标注每张图片

QT基础教程(文本绘制)

文章目录前言一、普通文本绘制二、绘制旋转文本三、旋转文本升级总结前言本篇文章我们来讲解一下QT中使用QPainter来绘制文本的案例。一、普通文本绘制在Qt中,你可以使用QPainter类来绘制文本,包括普通文本、格式化文本和自定义文本效果。下面是使用QPainter绘制文本的基本方法和示例:1.绘制普通文本:使用QP

Shiro【核心功能、核心组件、项目搭建 、配置文件认证、数据库认证 】(一)-全面详解(学习总结---从入门到深化)

目录Shiro介绍_Shiro核心功能Shiro介绍_Shiro核心组件Shiro入门_项目搭建Shiro入门_配置文件认证Shiro入门_数据库认证Shiro认证_将Shiro对象交给容器管理Shiro介绍_Shiro简介Shiro是apache旗下的一个开源安全框架,它可以帮助我们完成身份认证,授权、加密、会话管理

解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 5 (Vue 插件)

想了解Vue插件所以你看了官方文档却看不懂,或者你想知道Vue.use()方法和插件的关系。在本文档中,我们将参照文档讲解插件制作的基础知识,了解基础知识后,我们将制作与更实用的下拉菜单和脚本加载相关的插件。读完之后,您应该知道如何创建自己的插件以及如何添加插件。第一章Vue3项目创建1VueCLI创建vue项目第一章

Centos安装postgresql

一.执行安装命令与查看是否成功:1.yuminstall-ypostgresql-serverpostgresql-contrib2.安装后执行$psql--version或$psql-V可显示psql(PostgreSQL)9.2.243.另外,安装的同时还会创建postgres用户,Home为/var/lib/pg

构建无限画布,协作数字绘图 | 开源日报 0915

tldraw/tldrawStars:16.4kLicense:Apache-2.0tldraw是一个协作数字白板项目,可在tldraw.com上使用。它的编辑器、用户界面和其他底层库都是开源的,并且可以通过npm进行分发。您可以使用tldraw为产品创建一个即插即用的白板,或者将其作为构建自己无限画布应用程序的基础。

热文推荐