webSocket 学习

news2024/11/17 23:42:49

引子

WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它是 HTML5 中的一种新特性,能够实现 Web 应用程序和服务器之间的实时通信,比如在线聊天、游戏、数据可视化等。

相较于 HTTP 协议的请求-响应模式,使用 WebSocket 可以建立持久连接,允许服务器主动向客户端推送数据,避免了不必要的轮询请求,提高了实时性和效率。同时,WebSocket 的连接过程也比较简单,可以通过 JavaScript 中的 WebSocket API 进行创建和管理,并且可以和现有的 Web 技术如 HTML、CSS 和 JavaScript 无缝集成。

WebSocket 协议是基于握手协议(Handshake Protocol)的,它在建立连接时使用 HTTP/HTTPS 发送一个初始握手请求,然后服务器响应该请求,建立连接后就可以在连接上进行数据传输了。

总之,WebSocket 提供了一种快速、可靠且灵活的方式,使 Web 应用程序能够实现实时通信,同时也提高了网络性能和用户体验。

场景

  1. 实时性要求较高的应用,比如在线聊天、游戏、数据可视化等;
  2. 需要频繁交换数据的应用,比如在线编辑器、文件管理器等;
  3. 需要推送服务的应用,比如实时数据监控、通知系统等;
  4. 跨平台的应用,比如桌面应用程序、移动应用程序等。

demo 简易聊天 后端nodejs

ndoejs

import ws from 'ws'

const wss = new ws.Server({ port: 8080 })
const state = {
    HEART:1, 
    MESSAGE:2
}
wss.on('connection', (ws) => {
    console.log('连接 nodejs 服务器成功')
    ws.on('message', (message) => {
        console.log('接收到客户端发来的消息: ' + message)
        wss.clients.forEach((client) => {
            client.send(JSON.stringify({state:state.MESSAGE,message:"我是nodejs服务器,我收到你的消息了" + message}))
        })
    })
    let hraetInreval = null;
    //心跳包
    const sendHeart = () => {
        if(ws.readyState === ws.OPEN){
            ws.send(JSON.stringify({state:state.HEART,message:"心跳"}));
        }else{
            clearInterval(hraetInreval);
        }
    }
    hraetInreval = setInterval(sendHeart, 5000);
})
  1. 首先通过 new ws.Server({ port: 8080 }) 创建了一个 WebSocket 服务器,监听在本机的 8080 端口;
  2. wss.on('connection', (ws) => {...}) 的回调函数中,当有新的客户端连接时,会执行一些初始化操作:
  • 输出日志:console.log(‘连接 nodejs 服务器成功’)
  • 监听客户端发送的消息,并在控制台输出接收到的内容:ws.on(‘message’, (message) => {…})
  • 开启一个定时器,每 5 秒向该客户端发送一条心跳消息:setInterval(sendHeart, 5000);
  1. 客户端发送消息后,服务器会将消息广播给所有连接的客户端:wss.clients.forEach((client) => {…})
    state 是一个自定义的对象,包含了 HEART 和 MESSAGE 两个常量,用于标识消息的类型

前端代码

<!DOCTYPE html>
<html lang="en">

<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
   <style>

   </style>
</head>

<body>

   <div>
      <ul id="list">

      </ul>
      <input type="text" id="input">
      <button id="send">发送</button>
      <button id="stop">断开</button>
   </div>

   <script>
      //webSocket
      const list = document.querySelector('#list');
      const ws = new WebSocket('ws://localhost:8080');

      ws.addEventListener('open', () => {
         console.log('连接');
      });

      ws.addEventListener('message', (e) => {
         let data = JSON.parse(e.data)
         const li = document.createElement('li');
         if (data.state == 2) {
            li.innerText = data.message;
            list.appendChild(li);
         }
        
      });

      const btn = document.querySelector('#send');
      const input = document.querySelector('#input');
      const stop = document.querySelector('#stop');
      btn.addEventListener('click', () => {
         if (input.value) {
            ws.send(input.value)
            input.value = ''
         }
      })
      stop.addEventListener('click', () => {
         ws.close()
      })

   </script>
</body>

</html>

在 HTML 中,有一个包含输入框、发送按钮、断开连接按钮和消息列表的 div。其中输入框的 id 为 input,发送按钮的 id 为 send,断开连接按钮的 id 为 stop,消息列表的 id 为 list。

在 JavaScript 中,定义了一个 WebSocket 对象 ws,并通过 ws.addEventListener() 监听其 open 和 message 事件。当 WebSocket 连接成功时,会输出 连接;当接收到服务端返回的消息时,会解析 JSON 字符串并将消息添加到消息列表中。

此外,还监听了发送按钮和断开连接按钮的点击事件,并在点击后调用相应的方法。发送按钮点击事件会检查输入框中是否有文本,如果有则通过 WebSocket 发送消息;断开连接按钮的点击事件会关闭 WebSocket 连接。

本文正在参与 清华大学出版社 送书活动

阅读量500 抽一本书 以此类推 1000阅读量两本 评论区抽给粉丝

618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多个 IT 开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来京东查看详情吧!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM零基础到高级实战之Java内存区域虚拟机栈

JVM零基础到高级实战之Java内存区域虚拟机栈 JVM零基础到高级实战之Java内存区域虚拟机栈 文章目录 JVM零基础到高级实战之Java内存区域虚拟机栈前言JVM内存模型之虚拟机栈总结 前言 JVM零基础到高级实战之Java内存区域虚拟机栈 JVM内存模型之虚拟机栈 虚拟机栈是什么&#x…

Ansys Lumerical | 光纤布拉格光栅温度传感器的仿真模拟

说明 该示例演示了一种基于光纤布拉格光栅&#xff08;FBG&#xff09;的温度传感器&#xff0c;因为光纤折射率会随温度而变化&#xff0c;导致其布拉格波长发生偏移&#xff0c;所以可以被用作温度的测量。&#xff08;联系我们获取文章附件&#xff09; 综述 在本示例中要考…

java八股文-并发篇

并发篇 1. 线程状态 要求 掌握 Java 线程六种状态掌握 Java 线程状态转换能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建&#xff0c;但还未调用 start 方法时处于新建状态此时未与操作系统底层线程关联 可运行 调用了 start …

在Linux上安装Zookeeper集群(zookeeper-3.5.9)

记录&#xff1a;455 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用zookeeper-3.5.9版本&#xff0c;在三台机器上&#xff0c;安装Zookeeper集群。 版本&#xff1a;zookeeper-3.5.9&#xff0c;CentOS 7.9,Linux kernel-5.4.218。 1.主机规划 目标&#xff1a…

接口自动化测试新玩法!Python构建mock服务让你的测试更加高效!

目录 引言 Flask mock接口开发示例 引言 Mock 即模拟&#xff0c;就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法&#xff0c;其最大的优势就是降级前后端耦合度&#xff0c; 使前端工程师可以不…

Alloy Tutorial(1)Alloy 基本使用

文章目录 构造一个 graph谓词undirected 无向图undirected2 无向图的第二种写法assertFact扩展 构造一个 graph In this workshop we are going to use Alloy to model graphs. Mathematically, recall that a graph is just a pair ⟨V, E⟩ where V is a set of vertices (a…

参数估计和假设检验的区别与联系

1.参数估计和假设检验的区别与联系 笔记来源&#xff1a; 参数估计与假设检验 参数估计和假设检验有什么区别&#xff1f; 1.1 联系 参数估计和假设检验是推断统计的两个组成部分&#xff0c;它们都是根据样本信息对总体的数量特征进行推断 下图来自《统计学图鉴》 参数估计…

详解WEB集群服务(LNMP+Nginx+Tomcat+Rewrite重写+七层反向代理+SNAT|DNAT策略)

实战项目演练 1.问题描述2.实验操作步骤2.1 CentOS 7-1客户端配置2.2 CentOS 7-2网关服务器配置2.3 CentOS 7-8 (Web1:Tomcat服务器)2.3.1 安装Tomcat服务器2.3.2 提供四层反向代理的动态页面 2.4 CentOS 7-9 (Nginx服务器)2.4.1 安装Nginx服务2.4.2 安装MySQL服务2.4.3 安装配…

基于Python的接口自动化-读写配置文件

目录 引言 configparser模块功能介绍 引言 在编写接口自动化测试脚本时&#xff0c;有时我们需要在代码中定义变量并给变量固定的赋值。为了统一管理和操作这些固定的变量&#xff0c;咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中&#xff0c;后续需要用到这…

如何在电脑上使用wink一键高清短视频

如何在电脑上使用wink一键高清优化短视频画质 文章目录 如何在电脑上使用wink一键高清优化短视频画质1.软件简介1.1痛点1.2解决方案 2.实际操作2.1准备工作2.1.1下载雷电模拟器2.1.2下载wink 2.2.安装软件2.2.1安装雷电模拟器2.2.2安装wink2.2.2.1在雷电模拟器中安装wink2.2.2.…

LeetCode 双周赛 106(2023/06/10)两道思维题

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入知识星球提问。 往期回顾&#xff1a;LeetCode 单周赛第 348 场 数位 DP 模版学会了吗&#xff1f; 双周赛 106 概览 T1. 判断一个数是否迷人&#xff08;Easy&#xff09; 标…

如何做企业发布会直播/企业发布会直播流程

1 .企业发布会直播流程图 2 .发布会解决方案 A .发布会直播前 B .发布会直播中 C .发布会直播后 如何做一场企业新品、产品发布会直播&#xff1f;流程图&#xff1a; 01 发布会直播前 专业全案策划 全面深入挖掘客户直播需求&#xff0c;拆解需求&#xff0c;制定全流程落地方…

Selenium 必了解—如何测试REST API

目录 前言&#xff1a; Web UI测试存在的问题&#xff1a; REST API测试&#xff1a; 依赖包 程序示例&#xff1a; 1-获取联系人 2-GET Request&#xff1a; 3-POST Request: 4- 编辑请求 5- 删除请求 前言&#xff1a; Selenium WebDriver 可以用于测试 Web 应用的…

深度学习框架(Pytorch)学习第1步:包管理系统Anaconda的安装

PyTorch是一种开源的深度学习框架&#xff0c;以出色的灵活性和易用性著称。 并且与机器学习开发者和数据科学家喜欢的Python高级编程语言兼容。 什么是PyTorch PyTorch是一种构建深度模型功能完备的框架。通常用于图像识别和语言处理等。 使用Python编写&#xff0c;学习和…

UI自动化测试之Airtest让你的测试工作如虎添翼!

本文我们讲解下Airtest的使用&#xff0c;主要学习目标有以下几点&#xff1a; &#xff08;1&#xff09;认识Airtest &#xff08;2&#xff09;了解Airtest能做什么 &#xff08;3&#xff09;Airtest安装及环境搭建 &#xff08;4&#xff09;掌握Airtest图形化api使用 &am…

【MySQL】记录的基本操作

文章目录 插入数据为表中所有字段插入数据为表中指定字段插入数据同时插入多条数据 更新数据删除数据TRUNCATE和DETELE的区别 查询数据 插入数据 为表中所有字段插入数据 基本语法 INSERT INTO 表名&#xff08;字段名1,字段名2,…) VALUES (值 1,值 2,…); 示例 # 准备一张表…

算法模板(4):动态规划(4) 做题积累(2)

动态规划 9. 单调队列优化DP 1. 1088. 旅行问题 John 打算驾驶一辆汽车周游一个环形公路。 公路上总共有 n 个车站&#xff0c;每站都有若干升汽油&#xff08;有的站可能油量为零&#xff09;&#xff0c;每升油可以让汽车行驶一千米。 John 必须从某个车站出发&#xff…

接口自动化-让你了解数据库相关知识

目录 python接口自动化实战 数据库 写一个对数据库操作的类 python接口自动化实战 目标 学习数据库相关&#xff0c;用例增加对数据库校验 利用数据库完成对数据查询 如何校验数据库数据&#xff0c;怎样添加校验让程序自己校验&#xff08;充值、提现、投资接口对金额的…

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs)

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

分布式项目17 订单order,用dubbo来实现

说明&#xff1a;只要当一个订单生成时&#xff0c;处理订单的信息之外&#xff0c;还有订单中包含的订单商品数据以及订单物流信息&#xff0c;而订单的信息封装在“tb_order”表中&#xff0c;关于tb_order表结构如下图所示&#xff1a; 订单商品数据封装在“tb_order_item”…