WebSocket是什么,怎么用

news2024/12/22 20:31:06

74. WebSocket是什么,怎么用

当涉及到实时通信和即时更新的需求时,WebSocket 是一种强大且常用的解决方案。

1. 什么是 WebSocket?

WebSocket 是一种在客户端和服务器之间实现双向通信的协议。它允许服务器主动向客户端推送数据,并且客户端可以直接发送数据到服务器,而无需依赖传统的请求-响应模式。

与传统的 HTTP 请求不同,WebSocket 在建立连接后会保持持久连接,使得服务器和客户端可以实时地交换信息,而无需频繁地发起请求。这种特性使得 WebSocket 成为实时通信的理想选择。

2. WebSocket 的使用

下面是一个简单的使用 WebSocket 的示例:

客户端代码(JavaScript):

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

// 连接成功时的回调函数
socket.onopen = function () {
  console.log('WebSocket 连接成功');
};

// 接收到消息时的回调函数
socket.onmessage = function (event) {
  const message = event.data;
  console.log('接收到消息:', message);
};

// 连接关闭时的回调函数
socket.onclose = function () {
  console.log('WebSocket 连接关闭');
};

// 发送消息给服务器
function sendMessage(message) {
  if (socket.readyState === WebSocket.OPEN) {
    socket.send(message);
  } else {
    console.error('WebSocket 连接未打开');
  }
}

服务器端代码(Node.js,使用 ws 库):

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function (ws) {
  console.log('有新的 WebSocket 连接');

  // 接收客户端消息
  ws.on('message', function (message) {
    console.log('收到客户端消息:', message);

    // 广播消息给所有连接的客户端
    wss.clients.forEach(function (client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });

  // 连接关闭时的回调函数
  ws.on('close', function () {
    console.log('WebSocket 连接关闭');
  });

  // 发生错误时的回调函数
  ws.on('error', function (error) {
    console.error('WebSocket 错误:', error);
  });
});

上述代码创建了一个 WebSocket 客户端和一个 WebSocket 服务器。客户端通过实例化 WebSocket 对象并指定服务器的 URL 来连接到服务器。服务器使用 WebSocket 库创建一个 WebSocket 服务器,并监听连接、接收消息、广播消息等事件。

你可以根据需要修改代码以适应你的应用场景。

3. WebSocket 的适用场景

WebSocket 在以下情况下特别适用:

  1. 实时聊天应用:WebSocket 可以提供实时的双向通信,使得聊天应用能够实时地传递消息并更新聊天界面。
  2. 实时数据更新:如果你的应用需要实时地获取数据更新,例如股票市场行情、实时地图数据等,WebSocket 可以提供一种高效的方式来获取并传递这些实时数据。
  3. 多人协作应用:对于多人协作的应用,如实时编辑文档、白板协作等,WebSocket 可以实现实时同步和协作,让多个用户能够同时编辑和观察到最新的变化。
  4. 游戏应用:WebSocket 提供了实时双向通信的能力,使得游戏应用可以实现实时的游戏状态更新、多人游戏对战等功能。

总之,任何需要实时通信和即时更新的应用场景都可以考虑使用 WebSocket

4. WebSocket 的优点

  • 实时性:WebSocket 提供实时双向通信,能够实现实时的数据传输和更新,无需轮询或定时刷新页面。

  • 效率高:WebSocket 使用持久连接,减少了每个请求的开销,并且通过数据帧的方式传输数据,减少了数据的开销。

  • 可扩展性:WebSocket 可以扩展到支持大量的并发连接,适用于高并发的实时应用场景。

  • 简化开发:WebSocket 提供了简单易用的 API,使得开发者能够轻松地实现实时通信功能。

  • 跨平台支持:WebSocket 可以在各种平台上运行,包括 Web 浏览器、移动设备和服务器端。

5. WebSocket 的缺点

  • 浏览器兼容性:旧版本的浏览器可能不支持 WebSocket,因此在考虑使用 WebSocket 时,需要考虑兼容性问题,并提供替代方案。

  • 长连接维护:WebSocket 使用长连接,需要维护连接状态,这可能增加服务器的负载,并占用客户端和服务器的资源。

  • 安全性问题:WebSocket 允许实时双向通信,因此需要确保在应用中采取必要的安全措施,防止恶意攻击或滥用。

  • 需要服务器支持:WebSocket 需要服务器端实现 WebSocket 协议,因此需要在服务器端进行额外的配置或使用支持 WebSocket 的服务器框架。

综上所述,WebSocket 提供了一种强大的实时通信解决方案,适用于实时聊天、实时数据更新、多人协作和游戏等应用场景。然而,开发者需要在兼容性、长连接维护、安全性和服务器支持等方面进行综合考虑,并根据应用的需求选择合适的通信方案。

6. 实时聊天demo

客户端代码(html):

<!-- index.html/index1.html -->
<body>
  <h1>实时聊天 用户0/1</h1>
  <div id="chat-log"></div>
  <div>
    <input type="text" id="message-input" placeholder="输入消息">
    <button id="send-button">发送</button>
  </div>

  <script>
    const chatLog = document.getElementById('chat-log');
    const messageInput = document.getElementById('message-input');
    const sendButton = document.getElementById('send-button');

    const socket = new WebSocket('ws://localhost:8888');

    // 连接成功时的回调函数
    socket.onopen = function () {
      console.log('WebSocket 连接成功');
    };
    // 接收到消息时的回调函数
    socket.onmessage = function (event) {
      const message = event.data;
      if (message instanceof Blob || message instanceof ArrayBuffer) {
        // 如果接收到的是 Blob 或 ArrayBuffer 对象,则将其转换为文本
        const reader = new FileReader();
        reader.onload = function () {
          const text = reader.result;
          appendMessageToLog(text);
        };
        reader.readAsText(message);
      } else {
        // 如果接收到的已经是字符串,则直接追加到聊天记录
        appendMessageToLog(message);
      }
    };
    // 连接关闭时的回调函数
    socket.onclose = function () {
      console.log('WebSocket 连接关闭');
    };
    // 发生错误时的回调函数
    socket.onerror = function (error) {
      console.error('WebSocket 错误:', error);
    };
    // 发送消息给服务器
    sendButton.addEventListener('click', function () {
      const message = "用户0/1:  " + messageInput.value;
      if (message) {
        socket.send(message);
        messageInput.value = '';
      }
    });
    // 追加消息到聊天记录
    function appendMessageToLog(message) {
      const messageElement = document.createElement('div');
      messageElement.textContent = message;
      chatLog.appendChild(messageElement);
    }
  </script>
</body>

运行时选择Live Server.

服务器端代码(先安装ws依赖):

//server.js
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8888 });

wss.on('connection', function (ws) {
  console.log('有新的 WebSocket 连接');

  // 接收客户端消息
  ws.on('message', function (message) {
    if (typeof message === 'string') {
      console.log('收到客户端消息:', message);

      // 广播消息给所有连接的客户端
      wss.clients.forEach(function (client) {
        if (client.readyState === WebSocket.OPEN) {
          client.send(message);
        }
      });
    }
  });


  // 连接关闭时的回调函数
  ws.on('close', function () {
    console.log('WebSocket 连接关闭');
  });

  // 发生错误时的回调函数
  ws.on('error', function (error) {
    console.error('WebSocket 错误:', error);
  });
});

使用node server.js 运行

文件结构如图:

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

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

相关文章

在Mac上安装Aspectj1.9.8(用于Java17)

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. 测试AspectJ 5.1 简单命令行测试安装是否成功 5.2 在IDEA中添加对AspectJ的支持【todo】 5.3 敲测试代码并进行测试【todo】 -----------------------------…

如何将window文件夹挂载到VMware系统mnt目录

背景&#xff1a;项目开发过程中&#xff0c;通常是在Windows上编码&#xff0c;有些框架和软件只能够在Linux上面执行&#xff0c;如果在 VMware中的Linux上面开发不太方便&#xff0c;因此需要在Windows上面开发好再同步到Linux上面运行。 软件&#xff1a; Samba客户端 V…

nodejs安装及环境变量配置(修改全局安装依赖工具包和缓存文件夹及npm镜像源)

本机环境&#xff1a;win11家庭中文版 一、官网下载 二、安装 三、查看nodejs及npm版本号 1、查看node版本号 node -v 2、查看NPM版本号&#xff08;安装nodejs时已自动安装npm&#xff09; npm -v 四、配置npm全局下载工具包和缓存目录 1、查看安装目录 在本目录下创建no…

抓包技术的应用示例

前言 最近瑞幸在搞活动&#xff0c;每天免费送10000份咖啡&#xff0c;我是个不喝咖啡的人儿&#xff0c;所以没咋关注&#xff0c;今早我们的团宠小妹&#xff0c;拉着我 10点整拼手速&#xff0c;想着帮她抢一杯&#xff0c;于是点开瑞幸咖啡小程序主页&#xff0c;banner 栏…

数学建模常用算法之主成分分析

数学建模常用算法之主成分分析 引言步骤实例以及代码 引言 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;且能反映出原始数据的大部分信息。 一般来说&#…

机器学习笔记 - vision transformer(ViT)简述

一、ViT简述 视觉转换器 vision_transformer(ViT) 因其令人印象深刻的准确率和计算效率而迅速成为卷积神经网络 (CNN) 在计算机视觉任务中的首选替代品。ViT模型在许多数据集和任务组合中的表现比CNN高出近4倍,从而确立了自己作为非常强大的竞争者的地位。 同样,基于转换…

采样中断服务程序原理

采样中断服务程序框图如图2&#xff0d;6所示。采样中断服务程序主要包括采样计算&#xff0c;TV、TA断线自检和保护起动元件三个部分。同时还可以根据不同的保护特点&#xff0c;增加一些检测被保护系统状态的程序。 一、采样计算概述 进入采样中断服务程序&#xff0c;首先进…

抖音林客服务商入驻申请

抖音林客服务商后台提供了以下主要功能&#xff1a; 数据报告&#xff1a;可以查看账户的广告投放、效果等数据报告&#xff0c;并进行数据分析和优化。 广告投放平台&#xff1a;可以创建和管理广告投放计划、定向和出价等设置&#xff0c;以及监控广告投放效果。 …

【032】C++高级开发之继承机制详解(最全讲解)

C的继承机制详解 引言一、继承和派生1.1、继承的概念和意义1.2、派生类的定义 二、继承中的构造和析构2.1、子类的构造和析构顺序2.2、子类调用成员对象、父类的有参构造 三、子类和父类的同名处理3.1、子类和父类同名成员数据3.2、子类和父类同名成员函数3.3、子类重定义父类的…

2.5C++多重继承

C 多重继承概述 C中的多重继承是指一个派生类可以从多个基类中继承属性和方法。 多重继承的作用是让 C 中的类更灵活地组合&#xff0c;以及实现代码的高复用。 多重继承的语法如下&#xff1a; access_specifier可以是public、protected或private&#xff0c;用来指定继承…

python学习——文本数据处理

目录 1 计算长度 len2 大小写 lower、upper、title、capitalize、swapcase3 字符检索 get、slice4 元素提取 findall、extract5 索引操作 find、index6 字符类型判断,结果一定是True或False7 字符判断 contains、startswith、endswith8 替换 replace9 字符的分割 split、partit…

鸿蒙HarmonyOS开发环境初识及搭建

一 鸿蒙简介 HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备&#xff0c;提供…

A Sequence-to-Set Network for Nested Named Entity Recognition

原文链接&#xff1a; https://www.ijcai.org/proceedings/2021/0542.pdf IJCAI 2021 介绍 问题 将嵌套NER视为span分类任务存在两个缺陷&#xff0c;不仅搜索空间大还缺少了实体之间的交互。 IDEA 因此作者提出了sequence-to-set的模型&#xff0c;不再提前给定span&#x…

【数据分享】全国县市2000-2021年农业、工业数据(免费获取)

《中国县域统计年鉴》是一部全面反映我国县域社会经济发展状况的资料性年鉴&#xff0c;收录了上一年度全国2000多个县域单位的基本情况、综合经济、农业、工业、教育、卫生、社会保障等方面的资料。 之前基于《中国县域统计年鉴》我们分享了2000至2021年的综合经济数据&#…

详解eslint在vue中如何使用

ESLint在vue中的使用 阅读目录 .editorconfig文件&#xff08;主要用于配置IDE&#xff09;.eslintignore文件&#xff08;放置需要ESLint忽略的文件&#xff0c;只对.js文件有效&#xff09;.eslintrc.js 文件(用来配置ESLint的检查规则) ESLint的用途 1.审查代码是否符合编…

SwinTransformer与Vit细节总结

建议通过标题来快速跳转 Vit (Vision Transformer) Vit把图片打成了patch&#xff0c;然后过标准的TransformerEncoder&#xff0c;最后用CLS token来做分类 Vit的位置编码 作者在文中试了几种方式&#xff0c;发现这几种在分类上效果差不多 1-dimensional positional emb…

EMQ 明道云:零代码高效构建工业物联网设备管理平台

背景 智能物联网设备在 IIoT 场景中有着广泛的应用&#xff0c;但如何管理和监控这些设备是一个挑战。 明道云是一家专业的 hpaPaaS 平台服务商&#xff0c;其所开发的明道云平台&#xff08;Mingdao Cloud&#xff09;是一个企业软件设计和开发工具&#xff0c;让企业可以低…

[230608] 阅读TPO58汇总|7:30-9:00+17:05

目录 ​​​​​​​ TPO58 1 The Development of Instrumental Music [3]修辞目的题 举例说明的作用 [9]句子插入题 [10]小结题 2 Pinyon Pines and Pinyon Jays [4]否定事实信息题 [5]修辞目的题 段落在全篇的作用 [10]小结题 3 The Rise of Classic Maya Civi…

SecCertificate 解析

一、SecCertificate A digital certificate is a collection of data used to securely distribute the public half of a public/private key pair. 数字证书 1. 结构 2. 读取和存储 2.1 Identity var certificate: SecCertificate? let status SecIdentityCopyCertific…

12.分布式事务流程与事务消息源码分析

highlight: arduino-light Rocket事务流程&源码分析 Rocket解决分布式事务流程 事务消息分 2 个阶段&#xff1a; ① 正常事务消息的发送与提交&#xff1a; a.发送消息(half 消息) b.服务响应消息写入结果 c.根据发送结果执行本地事务(如果写入失败&#xff0c;此时half消…