什么是websockret连接

news2024/11/17 9:36:12

什么是WebSocket

WebSocket,是一种网络传输协议,位于 OSI 模型的应用层。可在单个 TCP 连接上进行全双工通信,能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输.

WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了。

WebSocket 与 HTTP的区别

WebSocket 的最大特点就是长连接,而且服务器和客户端可以互相发送信息。

HTTP 是短连接, 只能由客户端向服务端发起, HTTP为了添加长连接的功能, 有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个 HTTP 请求合并为一个,但是本质上就是客户端一次发多个请求,然后服务端慢慢返回多个response, 这不呢能称的上是长连接.

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 服务器,并监听连接、接收消息、广播消息等事件。

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

WebSocket 的适用场景

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

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

WebSocket 的优点

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

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

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

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

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

WebSocket 的缺点

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

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

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

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

总结:

综上所述,WebSocket 提供了一种强大的实时通信解决方案,适用于实时聊天、实时数据更新、多人协作和游戏等应用场景。然而,开发者需要在兼容性、长连接维护、安全性和服务器支持等方面进行综合考虑,并根据应用的需求选择合适的通信方案。
————————————————
版权声明:本文为CSDN博主「前端每日三省」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42560424/article/details/131380857

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

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

相关文章

一种结合白平衡统计信息和曝光信息的软光敏算法专利学习(专利三)

基础理论: 亮度计算: 对于白天模式而言,IR滤光片处于过滤红外光的状态,也就是说,摄像机的感光芯片所感受到的环境光中的红外光几乎为零;而对于夜晚模式而言,IR滤光片处于不过滤红外光的状态&am…

ABB 3BHB002916R0001 UFC721AE模拟输入卡

通道数目: UFC721AE 模拟输入卡通常具有多个输入通道,可以同时监测多个模拟信号。 输入类型: 这种卡片通常支持不同类型的模拟输入,例如电压信号、电流信号或其他传感器信号。 精度: UFC721AE 模拟输入卡通常具有高精…

树莓 LUMA-OLED.EXAMPLE使用

详细介绍在文件目录下的README.rst中 第一步 $ sudo usermod -a -G i2c,spi,gpio pi //好像没什么用 $ sudo apt install python3-dev python3-pip python3-numpy libfreetype6-dev libjpeg-dev build-essential //安装依赖包,树莓派中好像已经有了 $ sudo a…

Seata 笔记

Seata 笔记 分布式事务理论基础 CAP 定理 Consistency 一致性:用户访问分布式系统中的任意节点得到的结果都是一致的Availability 可用性:用户和访问任意健康节点都必须得到响应而不是超时拒绝Partition tolernance 分区容错性:出现独立分…

解决本地jar包导入maven

1、确定是否安装maven 2、输入导入命令 命令说明 <path-to-file>为你jar包所在的路径&#xff08;尽量简单并且不要含中文&#xff09; <group-id>为grouId号&#xff0c;与<artifact-id>组成唯一识别你jar包的坐标&#xff0c;当不在公共资源jar包中&#…

libbpf-bootstrap安卓aarch64适配交叉编译

1.为什么移植 疑惑 起初我也认为&#xff0c;像libbpf-bootstrap这样在ebpf程序开发中很常用的框架&#xff0c;理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码&#xff0c;各个内核上的ebpf虚拟机大同小异&#xf…

万字解读 Android 车机核心 :CarService 的构成和链路~

前言 关于 Android 车机&#xff0c;之前分析过方控上自定义按键的输入机制和中控上旋钮输入的原理&#xff0c;但都局限于 Car Service 内 Input 相关模块。 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车载的自定义事件机制 本文将结合 Android 系…

LabVIEW开发感应电机在线匝间短路故障诊断系统

LabVIEW开发感应电机在线匝间短路故障诊断系统 工业中使用的超过85%的电动机是三相感应电动机。它们因其可靠性、设计便利性、高性能和过载能力而被广泛用于不同的应用&#xff0c;例如制造、加工、电力系统、运输等。无论它们的能力如何&#xff0c;它们都被认为是现代工业学…

Consider defining a bean of type问题解决

Consider defining a bean of type问题解决 Consider defining a bean of type问题解决 包之后&#xff0c;发现项目直接报错Consider defining a bean of type。 会有一些包你明明Autowired 但是还是找不到什么bean 导致你项目启动不了 解决方法一: 这个问题主要是因为项目拆包…

安卓 MeasureCache优化了什么?

安卓绘制原理概览_油炸板蓝根的博客-CSDN博客 搜了一下&#xff0c;全网居然没有人提过 measureCache。 在前文中提到过&#xff0c;measure的时候&#xff0c;如果命中了 measureCache&#xff0c;会跳过 onMeasure&#xff0c;同时会设置 PFLAG3_MEASURE_NEEDED_BEFORE_LAYOU…

【已解决】oracle获取最近2学年的数据

已解决 &#xff1a;oracle获取最近2学年的数据 SELECT * FROM (SELECT * FROM xx.JWXT_XSKB WHERE AND xn IN (‘2023-2024’,‘2022-2023’)); 问题 某某系统课表数据过大&#xff0c;要求只获取最近2学年的数据&#xff0c;不能写死。 思路 mysql 在子查询的WHERE子句中…

从0到1学会Git(第二部分):Git的本地操作和管理

写在前面:本文介绍了在本地仓库进行文件的处理以及本地的合并等操作。 前置知识:文件可以处在三个区域&#xff0c;分别为工作区&#xff0c;暂存区和本地仓库&#xff0c;我们此文的目标即是将文件存储在本地仓库中。我们可以将文件的区域理解为&#xff0c;cpu中&#xff0c…

苍穹外卖技术栈

重难点详解 1、定义全局异常 2、ThreadLocal ThreadLocal 并不是一个Thread&#xff0c;而是Thread的一个局部变量ThreadLocal 为每一个线程提供独立的存储空间&#xff0c;具有线程隔离的效果&#xff0c;只有在线程内才能取到值&#xff0c;线程外则不能访问 public void …

linux入门---动静态库的加载

目录标题 为什么会有动态库和静态库静态库的实现动态库的实现动静态库的加载 为什么会有动态库和静态库 我们来模拟一个场景&#xff0c;首先创建两个头文件 根据文件名便可以得知add.h头文件中存放的是加法函数的声明&#xff0c;sub.h头文件中存放的是减法函数的声明&#…

【每日运维】U盘启动盘安装 ESXi 6.7.0 安装卡在 loading /bnxtroce.v00

问题描述 ● ESXi 6.7.0 安装进度卡在loading /bnxtroce.v00 进度处 处理方法 ● 重新制作启动盘&#xff0c;写入方式改为&#xff1a;【USB-ZIPv2】 ● 设置服务器的 bios设置&#xff0c;启动方式改为【UEFI】 ● 重启开机安装即可

蛋白与蛋白互作预测 蛋白互作预测protein

How to prepare structures for HADDOCK? – Bonvin Labhttps://www.bonvinlab.org/software/bpg/structures/RosettaDock: 蛋白-蛋白复合物对接预测 - 知乎 (zhihu.com) 要进行LPR1-SEPP1复合物的结合亲和力预测&#xff0c;您可以按照以下步骤进行&#xff1a; 获取蛋白质结…

MySQL的Json类型个人用法详解

前言 虽然MySQL很早就添加了Json类型&#xff0c;但是在业务开发过程中还是很少设计带这种类型的表。少不代表没有&#xff0c;当真正要对Json类型进行特定查询&#xff0c;修改&#xff0c;插入和优化等操作时&#xff0c;却感觉一下子想不起那些函数怎么使用。比如把json里的…

vue实现列表自动滚动效果

效果如图&#xff1a; 1.下载插件 npm install vue-seamless-scroll --save 2.在main.js中引入注册 import scroll from vue-seamless-scroll Vue.use(scroll) 3.在页面中使用&#xff08;写一个固定的表头 el-table:show-header"status" 设置为false,自带的表头不…

嵌入式虚拟仿真实验教学平台使用教程之搭建课程计划

嵌入式虚拟仿真实验教学平台使用教程之创建课程计划 所谓「课程计划」就是将一系列实验按照一定的顺序组织成一个教学计划&#xff0c;和传统的教学计划模式比较类似。接下来我将为大家讲解如何通过该平台创建属于自己的课程计划。 嵌入式虚拟仿真实验教学平台提供了两种创建课…

Python综合案例(基本地图使用)

一、基本地图的使用 基本代码&#xff1a; """ 演示地图可视化的基本使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京", 99),("…