前端 websocket

ops/2024/12/15 19:48:45/

一、定义和基本概念

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得客户端和服务器之间可以进行实时的、双向的数据传输。与传统的 HTTP 请求-响应模式不同,WebSocket 允许服务器主动向客户端推送数据,而不需要客户端先发起请求。这为实时性要求较高的应用场景,如在线聊天、实时数据监控、多人协作编辑等提供了高效的通信机制。

二、工作原理

1. 建立连接

客户端通过发送一个 HTTP 请求(称为 WebSocket 握手请求)来启动与服务器的连接。这个请求包含特殊的`Upgrade: websocket`和`Connection: Upgrade`头部信息,告诉服务器客户端希望升级到 WebSocket 协议。

例如:在 JavaScript 中,使用`new WebSocket('ws://your-server-address');`(如果是加密连接则是`wss://`)来发起握手请求。

服务器收到请求后,如果支持 WebSocket 协议,会返回一个响应,完成握手过程,建立起 WebSocket 连接。这个连接会在客户端和服务器之间保持打开状态,用于后续的数据传输。

2. 数据传输

一旦连接建立,客户端和服务器就可以通过这个连接双向发送数据。数据以帧的形式传输,有文本帧和二进制帧两种类型。在 JavaScript 客户端中,可以使用`send`方法发送数据,如`webSocket.send('message');`发送文本消息,或者发送`ArrayBuffer`等二进制数据。

服务器接收到数据后,可以进行相应的处理,然后将处理后的结果或新的数据发送回客户端。这种双向通信可以实时进行,没有传统 HTTP 请求的延迟。

3. 关闭连接

当通信结束或者出现错误等情况时,客户端或服务器可以主动发起连接关闭。在客户端,可以使用`close`方法(如`webSocket.close();`)来关闭连接。服务器也有相应的机制来关闭连接,并且会向客户端发送一个关闭帧。

三、在前端的应用场景

1. 实时聊天应用

多个用户之间可以实时发送和接收消息。当一个用户发送消息时,通过 WebSocket 将消息发送到服务器,服务器再将消息广播给其他在线用户。这样可以实现即时的聊天体验,避免了传统 HTTP 轮询方式的延迟和资源浪费。例如,一个简单的聊天应用可以在客户端通过 WebSocket 发送聊天消息,在服务器端处理消息的转发,然后在其他客户端接收并显示消息。

2. 实时数据展示(如金融数据、物联网数据)

对于实时更新的数据,如股票价格、传感器数据等,WebSocket 可以让服务器在数据变化时立即将新数据推送到客户端。客户端可以实时更新界面,展示最新的数据。例如,一个金融网站可以通过 WebSocket 接收股票行情数据,然后在网页上动态地更新股票价格图表和相关信息。

3. 协同工作和在线游戏

在多人协作的应用场景中,如在线文档编辑、团队任务管理或者多人在线游戏,WebSocket 可以用于实时同步各个用户的操作。例如,在一个在线文档编辑工具中,当一个用户进行文本编辑、添加或删除内容时,这些操作可以通过 WebSocket 实时发送到服务器,然后服务器将这些操作同步给其他正在编辑的用户,保证所有用户看到的文档内容是实时更新的。

四、与其他通信方式的比较(以 HTTP 轮询为例)

1. 效率

WebSocket 在建立连接后,数据可以实时双向传输,不需要像 HTTP 轮询那样频繁地发送请求来获取最新数据。HTTP 轮询是客户端按照一定的时间间隔不断向服务器发送请求,询问是否有新的数据。这种方式会产生大量不必要的请求,浪费网络资源和服务器资源。

WebSocket 的全双工通信机制使得数据传输更加高效,特别是在数据更新频繁的场景下,可以大大减少网络延迟和服务器负载。

2. 实时性

WebSocket 的实时性更强,因为它允许服务器主动推送数据。而 HTTP 轮询依赖于客户端的请求频率,如果轮询间隔过长,会导致数据更新不及时;如果轮询间隔过短,又会增加请求次数。


http://www.ppmy.cn/ops/142188.html

相关文章

【JavaWeb后端学习笔记】Redis常用命令以及Java客户端操作Redis

redis 1、redis安装与启动服务2、redis数据类型3、redis常用命令3.1 字符串String3.2 哈希Hash3.3 列表List3.4 集合Set(无序)3.5 有序集合zset3.6 通用命令 4、使用Java操作Redis4.1 环境准备4.2 Java操作字符串String4.3 Java操作哈希Hash4.4 Java操作…

【Linux】Ubuntu:安装系统后配置

hostname:更改主机名 打开终端。 使用hostnamectl命令更改主机名。 sudo hostnamectl set-hostname 新的主机名你可以使用hostnamectl 命令来验证更改是否成功: hostnamectlChrome:更换默认浏览器 以下是从 Ubuntu 中移除预装的 Snap 版 Fi…

使用BMFont创建适用于Unity的艺术字

最近经常使用艺术字,虽然之前的工作经验我知道只需要修什么哪些就可以弄好艺术字的创建和间隔,所以打算做个总结,接下来分为以下几步(其中会有补充,最后会有如何解决unity艺术字的字距问题) 第1步 下载BMF…

【人工智能-中级】卷积神经网络(CNN)的中阶应用:从图像分类到目标检测

文章目录 卷积神经网络(CNN)的中阶应用:从图像分类到目标检测1. 图像分类:CNN的基础应用CNN结构概述经典网络架构2. 目标检测:从分类到定位基于区域的目标检测方法单阶段目标检测方法边界框回归与NMS(Non-Maximum Suppression)3. 深度学习中的目标检测挑战与解决方案4. …

数组专题leetcode

链表适合插入、删除,时间复杂度 O(1) 数组是适合查找操作,但是查找的时间复杂度并不为 O(1)。即便是排好序的数组,你用二分查找,时间复杂度也是 O(logn) 数组:内存连续的存储相同类型 【数组插入】: 如果在数组的末…

Android中bindService和startService启动服务有何区别

Android中bindService和startService启动服务有何区别 bindService 和 startService 是 Android 中两种用于与 Service 交互的方式,它们的区别主要在于 生命周期管理 和 使用场景。以下是详细对比: 1. bindService方式 bindService 是一种绑定方式&am…

【大语言模型】ACL2024论文-25 微妙偏见需要更微妙的衡量:双重指标评估大型语言模型中的代表性和亲和力偏见

【大语言模型】ACL2024论文-25 微妙偏见需要更微妙的衡量:双重指标评估大型语言模型中的代表性和亲和力偏见 目录 文章目录 【大语言模型】ACL2024论文-25 微妙偏见需要更微妙的衡量:双重指标评估大型语言模型中的代表性和亲和力偏见目录文章信息摘要研究…

专业140+总分400+北京理工大学826信号处理导论考研经验北理工电子信息与通信工程,真题,大纲,参考书。

考研总分400,专业826信号处理导论(信号与系统和dsp)140,成功上岸北理工,虽然已经一段时间,但是后劲很大,每每回想还是昨日事,群里同学多次要求分享自己的一些经验,感谢大…