1.项目使用记录

1.医疗项目中渲染回收柜温湿度,需要实时更新

2.回收柜安瓿回收和余液回收时,需要前端发送指令给回收柜,比如开门、关门等。还需要收到回收柜结果,比如回收的药品信息等。

我项目中用的是浏览器自带的websoket,也可以下载插件等

2.注意提示:

到线上环境时:地址要从 ws变为wss,并且需要后端或者运维更改websoket协议才可以用,const WS_URL = 'wss://10.20.21.31:9321/ws'

3.websoket用法

1.创建 WebSocket 连接

  const ws = new WebSocket('wss://example.com/socket');

2.websoket方法

.send()

  • 发送消息到 WebSocket 服务器。
  • ws.send('Hello, server!');

.close()

  • 关闭 WebSocket 连接
  • ws.close(); // 正常关闭
  • ws.close(1000, 'Closing connection'); // 带有状态码和原因

3.WebSocket 事件

onopen
  • 当 WebSocket 连接成功建立时触发。
  • ws.onopen = function(event) { console.log('Connection established!'); };
onmessage
  • 当从服务器接收到消息时触发。
  • socket.onmessage = function(event) {
    console.log('Message from server:', event.data);
    };
onerror
  • 当发生错误时触发。
  • ws.onerror = function(event) {
    console.error('WebSocket error:', event);
    };
onclose
  • 当 WebSocket 连接关闭时触发。
  • ws.onclose = function(event) {
    console.log('Connection closed:', event);
    };

4. WebSocket 属性

readyState
  • 返回 WebSocket 的当前状态。
  • 状态值:
    • 0 (CONNECTING):正在连接。
    • 1 (OPEN):连接已建立,可以通信。
    • 2 (CLOSING):连接正在关闭。
    • 3 (CLOSED):连接已关闭。
url
  • 返回 WebSocket 连接的 URL。
protocol
  • 返回与 WebSocket 服务器协商的子协议(如果有)。

5. WebSocket 状态码 (用于 close() 方法)

WebSocket 协议定义了一些标准的关闭状态码,当调用 close() 方法时,可以传递一个状态码来表明关闭的原因。

  • 1000:正常关闭连接。
  • 1001:对方主机没有响应。
  • 1002:协议错误。
  • 1003:接收到不支持的数据类型。
  • 1004:无效的数据。
  • 1005:无状态码(关闭没有给出状态码)。
  • 1006:连接异常关闭。
  • 1007:收到数据不符合协议的格式。
  • 1008:政策限制,服务器关闭连接。
  • 1009:消息太大。
  • 1010:扩展不接受的协商。
  • 1011:服务器由于临时条件无法完成请求。

6. 自定义事件监听(推荐)

除了直接为事件设置回调函数外,你也可以使用 addEventListener() 方法来监听 WebSocket 事件:

socket.addEventListener('open', function(event) {console.log('Connection established!');
});socket.addEventListener('message', function(event) {console.log('Message from server:', event.data);
});socket.addEventListener('error', function(event) {console.error('WebSocket error:', event);
});socket.addEventListener('close', function(event) {console.log('Connection closed:', event);
});

4.代码:

1.文件位置:src\utils\ws.js

// ws.js
const WS_URL = 'wss://10.20.21.31:9321/ws' //线上环境用wss
//开发环境用 'ws://10.20.21.31:9321/ws'let ws = null
let reconnectTimer = null
let reconnectDelay = 3000 // 3秒重连间隔
let isManuallyClose = false
export function connectWS(options) {if (ws && ws.readyState === WebSocket.OPEN) return wsws = new WebSocket(WS_URL)ws.onopen = () => {console.log('WebSocket 已连接')if (typeof options === 'function') {// 旧写法: connectWS(fn)// 不提供 onOpen 回调} else if (options && typeof options.onOpen === 'function') {options.onOpen()}}ws.onmessage = (event) => {if (typeof options === 'function') {options(event.data) // 旧写法} else if (options && typeof options.onMessage === 'function') {options.onMessage(event.data) // 新写法}}ws.onclose = () => {console.log('WebSocket 已关闭')// if (!isManuallyClose) {//   // 自动重连//   clearTimeout(reconnectTimer)//   reconnectTimer = setTimeout(() => {//     console.log('尝试重连...')//     connectWS({ onMessage, onOpen, onError, onClose })//   }, reconnectDelay)// }// if (onClose) onClose()}ws.onerror = (err) => {console.error('WebSocket 错误:', err)}return ws
}export function sendWS(message) {if (ws && ws.readyState === WebSocket.OPEN) {ws.send(typeof message === 'string' ? message : JSON.stringify(message))} else {console.warn('WebSocket 未连接,无法发送消息')}
}export function closeWS() {if (ws) {ws.close()ws = null}
}

2.项目使用代码

 mounted() {//去连接connectWS({onMessage: (data) => this.handleMessage(data)}) // 项目中首先给后端发送信息setTimeout(() => {this.sendMessage()}, 500)},
methods:{// 接收到 WebSocket 消息handleMessage(datas) {let data = JSON.parse(datas)console.log('后端返回:', data)if(data.deviceToken == this.deviceToken){this.dataBack = data}          this.pendLoading = false},
//给后端发送信息sendMessage() {// 获取当前时间戳(毫秒)const timestamp = Date.now();// 拼接 "ABHS" 和时间戳const result = `ABHS${timestamp}`;console.log('给后端发送信息',{msgType: '5',deviceToken: this.deviceToken,// seqId: result,});return new Promise((resolve) => {sendWS({cmd: {msgType: '5',deviceToken: this.deviceToken,// seqId: result,},ip: this.ip,})})},}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95535.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95535.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95535.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevOps篇之通过GitLab CI 流水线实现k8s集群中helm应用发布

一. 设计思路 构建一个 GitLab CI 流水线,并且要集成到 K8s 集群中的 Helm 应用发布流程。首先,需要了解 GitLab CI 的基本结构,比如.gitlab-ci.yml 文件的配置,包括 stages、jobs、变量设置等。然后,结合之前讨论的 H…

详尽 | Deeplabv3+结构理解

https://arxiv.org/pdf/1802.02611.pdf https://link.springer.com/chapter/10.1007/978-3-319-10578-9_23 目录 Deeplabv3 Encoder部分 Decoder部分 补充摘要 SPP 空间金字塔池化层模块 Dilated/Atrous Conv 空洞卷积 Deeplabv3 deeplab-v3是语义分割网络,组…

【51单片机】【protues仿真】基于51单片机音乐盒(8首歌曲)系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、数码管显示当前歌曲序号 2、按键切换歌曲和播放暂停​ 3、内置8首音乐 二、使用步骤 基于51单片机的音乐盒是一种能够存储和播放多首歌曲的电子设备,通过定时器产…

@ZooKeeper 详细介绍部署与使用详细指南

文章目录 **ZooKeeper 详细介绍、部署与使用** 1. 概述 & 核心介绍 1.1 什么是 ZooKeeper? 1.2 核心特性 1.3 核心概念 1.4 典型应用场景 2. 部署 (以 3 节点集群为例) 2.1 环境准备 2.2 安装步骤 (在所有节点执行) 2.3 启动与停止集群 2.4 防火墙配置 (如果开启) 3. 基本…

腾讯Hunyuan-MT-7B翻译模型完全指南:2025年开源AI翻译的新标杆

🎯 核心要点 (TL;DR) 突破性成就:腾讯混元MT-7B在WMT25全球翻译竞赛中获得30/31项第一名双模型架构:Hunyuan-MT-7B基础翻译模型 Hunyuan-MT-Chimera-7B集成优化模型广泛语言支持:支持33种语言互译,包括5种中国少数民…

Web 集群高可用全方案:Keepalived+LVS (DR) 负载均衡 + Apache 服务 + NFS 共享存储搭建指南

文章目录Keepalived LVS(DR) Apache NFS项目背景业务场景与核心需求传统架构的痛点与局限技术方案的选型逻辑项目价值与预期目标项目实践项目环境基础配置配置 router配置免密登录-可选配置 nfs配置 web配置 LVS-RS配置 HA 和 LVS-DS配置 ha1配置 ha2测…

Prometheus监控预警系统深度解析:架构、优劣、成本与竞品

目录 一、Prometheus是什么?核心定位与架构 二、竞品分析(Prometheus vs. Zabbix vs. Nagios vs. Commercial SaaS) 三、部署成本分析 四、服务器资源消耗分析 五、给您的最终建议 一、Prometheus是什么?核心定位与架构 Prom…

Nginx反向代理及配置

Nginx反向代理 二级域名系统 顾名思义,我们有很多的这个不同的二级域名的用户来访问我们,比如说微博。它有一个主域名weibo.com。如果我叫一鸣,申请了一个微博,然后我就可以在微博这个主系统上申请一个二级域名来访问我微博的主页&#xff0…

嵌入式系统通信总线全景探秘:从板内到云端

引言 在嵌入式系统设计中,选择合适的通信总线是决定系统性能、成本和可靠性的关键因素。从简单的芯片间通信到复杂的工业网络,不同的总线技术各司其职,形成了嵌入式世界的"交通网络"。本文将深入探讨五种经典且重要的通信技术&…

2022版Unity创建时没有2D灯光(2D Light),没有Global LIght2D怎么办?

简单来说就是你的渲染管线没有升级到URP管线,所以才没有这些2D灯光 如果你的创建灯光和我一样,没有红线划掉的部分,说明你和我的问题一样,看下面的教程可以解决。 1. 确保Unity版本 确保你的Unity版本至少为2019.4或更高版本&…

技术小白如何快速的了解opentenbase?--把握四大特色

1.基本介绍 作为一名计算机专业相关背景的学生,我们或多或者接触过一些数据库,对于数据库肯定是有所了解的; 你可能学习的是和微软的sql server这样的数据库; 你可能接触的更多的是企业级项目开发里面使用的这个mysql数据库&#…

企业微信AI落地:如何选择企业微信服务商?

现在企业用企业微信做客户运营,最怕的不是“没AI工具”,而是“AI用不起来”——要么功能不贴业务场景,员工嫌麻烦不用;要么回复不专业,客户体验差;要么数据不同步,管理者看不到效果。其实解决这…

【学Python自动化】 11 标准库简介 —— 第二部分

一、格式化输出 reprlib 模块 提供定制版 repr(),缩略显示大型或深层嵌套对象import reprlib reprlib.repr(set(supercalifragilisticexpialidocious)) # "{a, c, d, e, f, g, ...}"pprint 模块 美化输出,添加换行和缩进显示复杂数据结构impor…

【Kubernetes】知识点2

15. 什么是Pod的根容器?答:Pod 的根容器是每个 Pod 中默认存在的一个特殊容器pause容器,有时也称为infra容器,它是Pod 启动时创建的第一个容器,也是整个 Pod中所有容器的 “父容器”。其核心作用是为 Pod 内的所有容器…

视频增强AI哪个效果好?实战对比帮你找到最适合的工具

hitpaw 牛小影hitpaw 牛小影在处理低质量视频时,我们经常会遇到画面模糊、噪点过多、分辨率不足等问题,比如老旧视频资料修复、监控录像清晰化、手机拍摄视频画质提升等。这时候,一款好用的视频增强AI软件就成了刚需。下面就为大家盘点几款效…

C#工作流示例(WorkflowCore)

using Microsoft.Extensions.DependencyInjection; using WorkflowCore.Interface; using WorkflowCore.Models;namespace LeaveRequestWorkflow {// 请假申请单public class LeaveBill{/// <summary>/// 申请人/// </summary>public string EmployeeName { get; s…

两个子进程之间使用命名pipe

两个子进程间可以使用命名管道&#xff0c;非常简单。管道如果文件一样存在硬盘中&#xff0c;使用ls可以查看&#xff0c;管道文件0字节。使用fork函数分别创建两个子进程。 一个负责读数据&#xff0c;一个负责写数据。 #define _GNU_SOURCE #include <stdio.h> #inclu…

第一讲、Kafka 初识与环境搭建

一、Kafka 是什么&#xff1f; Apache Kafka 是一个分布式的消息队列&#xff08;Message Queue&#xff09;与流处理平台。 它最早由 LinkedIn 开发&#xff0c;后来捐赠给 Apache 基金会&#xff0c;现已广泛应用于日志收集、实时数据管道和大数据处理。 Kafka 的特点&…

Conda相关的用法

1、背景 此文主要记录conda的一些用法&#xff0c;大部分命令来自ai搜索以及自己的理解。 2、安装conda 2.1 选择 conda 版本 2.1.1 Anaconda 含有 Conda 大量科学计算包&#xff08;NumPy、Pandas、Matplotlib 等&#xff09;适合数据科学、机器学习初学者下载地址&…

数据库选择有讲究?SQLite、PostgreSQL还是MySQL?

不同规模的项目&#xff0c;数据库选择有讲究。大家好&#xff0c;我是技术支持彼得&#xff0c;每天两眼一睁就是为客户解决问题。在日常使用我们的视频平台时&#xff0c;很多用户会问到数据库选择的问题。今天就来详细说说EasyGBS、EasyNVR和EasyCVR三大平台该如何选择数据库…