深入理解WebSocket:实时双向通信的利器
一、介绍
1.1 基础概念介绍
- 单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。
- 半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。
- 全双工:同时可进行双向数据传输。
1.2 WebSocket介绍
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它能够在客户端和服务器之间建立实时、双向的通信通道。
与传统的HTTP通信相比,WebSocket更轻量级、更高效,适用于需要实时通信或推送消息的场景。
WebSocket的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。
1.2.1 websocket 出现背景
WebSocket是一种在客户端和服务器之间建立持久连接的通信协议。它的背景可以追溯到Web应用程序需要实时双向通信的需求。
在传统的HTTP通信中,HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。
客户端发送请求,服务器响应后即断开连接,HTTP 协议无法实现服务器主动向客户端发起消息,因此无法支持实时性要求高的应用场景,比如在线游戏、即时聊天、股票行情等。
很多网站为了实现推送技术,所用的技术都是轮询。即在特定得时间间隔,由浏览器对服务器发出http请求。
为了解决这一问题,Web开发者开始寻找一种更有效的方式来实现实时通信。WebSocket应运而生,它允许在客户端和服务器之间建立一次连接,并且可以在连接建立后保持长时间活跃,双方可以随时发送数据。这种持久连接的特性使得WebSocket非常适合实时通信应用场景,从而推动了Web应用程序的发展。
WebSocket的发展背景还包括了对网络性能和效率的追求。相比传统的HTTP轮询或长轮询方式,WebSocket可以减少通信的延迟和带宽消耗,提升了网络通信的效率。这也是WebSocket在各种实时通信应用中得到广泛应用的重要原因之一。
总的来说,WebSocket的研发背景主要是为了满足Web应用程序对实时通信的需求,并且提升网络通信的效率和性能。
1.3 websocket与HTTP比较
1.3.1 相似之处:
-
基于TCP/IP协议:WebSocket和HTTP都是基于TCP/IP协议栈的应用层协议。
-
用于客户端和服务器之间的通信:WebSocket和HTTP都是用于客户端和服务器之间的通信,但在用途上有所区别。
1.3.2 不同之处:
-
通信方式:
- HTTP:HTTP是一种单向的、无状态的通信协议,通常是客户端向服务器发起请求,服务器返回响应的模式。
- WebSocket:WebSocket是一种全双工的通信协议,允许客户端和服务器之间同时发送和接收数据,实现了双向通信。
-
连接方式:
- HTTP:HTTP是一种短连接的协议,每次通信都需要建立一个新的连接,通信结束后立即关闭连接。
- WebSocket:WebSocket是一种长连接的协议,一旦建立连接,客户端和服务器之间可以保持长时间的通信,不需要频繁地建立和断开连接。
-
数据格式:
- HTTP:HTTP通常使用文本格式来传输数据,如HTML、JSON等。
- WebSocket:WebSocket支持传输任意格式的数据,可以是文本、二进制等。
-
实时性和效率:
- HTTP:HTTP通常是基于请求-响应模式,因此在实时性和效率上有一定的限制,适用于普通的网页浏览和数据传输。
- WebSocket:WebSocket是专门设计用于实时通信的协议,实时性和效率较高,适用于需要实时通信或推送消息的场景。
-
适用场景:
- HTTP:适用于普通的网页浏览、数据传输等场景。
- WebSocket:适用于实时聊天应用、在线游戏、实时数据展示等需要实时通信的场景。
1.4 websocket握手过程
WebSocket握手过程是建立WebSocket连接的第一步,它是基于HTTP协议的,但在一定程度上有所不同。以下是WebSocket握手过程的简要步骤:
-
客户端发送WebSocket握手请求:客户端发送一个HTTP请求给服务器,请求升级连接为WebSocket。请求中包含了一些特殊的头部字段,如Upgrade和Connection字段,以及Sec-WebSocket-Key字段等。
-
服务器响应WebSocket握手请求:服务器收到客户端的握手请求后,会进行验证并作出响应。服务器会返回一个HTTP 101状态码(表示协议切换)并在响应头部中包含一些特殊的字段,如Upgrade和Connection字段,以及Sec-WebSocket-Accept字段等。同时,服务器也会发送一些WebSocket扩展和子协议等信息。
-
建立WebSocket连接:客户端收到服务器的响应后,如果状态码为101,则握手成功,此时WebSocket连接已经建立。客户端和服务器可以通过该连接进行双向通信。
-
双方开始交换数据:建立了WebSocket连接后,客户端和服务器可以随时发送数据,并且可以实现双向通信。
需要注意的是,WebSocket握手过程在HTTP层面进行,但建立了WebSocket连接后,通信协议会切换到WebSocket协议,之后的通信就不再遵循HTTP协议的规则。这样可以实现更加高效和实时的双向通信。
二、WebSocket的用法
1. 创建WebSocket连接
在JavaScript中,可以使用WebSocket API来创建WebSocket连接:
var socket = new WebSocket('ws://example.com/socket');
2. 监听WebSocket事件
可以监听WebSocket对象的各种事件,包括连接建立、消息接收、连接关闭等:
socket.onopen = function() {console.log('WebSocket连接已建立');
};socket.onmessage = function(event) {console.log('收到消息:', event.data);
};socket.onclose = function() {console.log('WebSocket连接已关闭');
};
3. 发送和接收消息
通过WebSocket对象的send方法可以向服务器发送消息,服务器也可以通过WebSocket对象的send方法向客户端发送消息:
// 发送消息
socket.send('Hello, Server!');// 接收消息在onmessage事件中处理
socket.onmessage = function(event) {console.log('收到消息:', event.data);
};
三、WebSocket在项目中的应用
WebSocket可以被广泛应用于需要实时通信或推送消息的场景,例如:
-
实时聊天应用:WebSocket能够实现即时通讯,可以让用户之间实时发送消息、接收消息。
-
在线游戏:WebSocket可用于在线游戏中,实现玩家之间的实时交互、游戏状态的同步等功能。
-
实时数据展示:对于需要实时展示数据变化的项目,如股票交易系统、监控系统等,可以使用WebSocket将实时数据推送给客户端。
-
协作编辑:在协作编辑类的应用中,多个用户可以同时编辑同一个文档或项目,WebSocket可以用于实现多用户之间的实时同步。
-
通知推送:WebSocket可以用于向客户端推送实时通知,例如新消息通知、系统提醒等。
3.1 示例:实时聊天应用
下面是一个简单的实时聊天应用的示例,使用WebSocket实现客户端和服务器之间的实时通信:
1、服务端代码(Node.js)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function connection(ws) {ws.on('message', function incoming(message) {console.log('收到消息:', message);// 广播消息给所有客户端wss.clients.forEach(function each(client) {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(message);}});});
});
2、客户端代码(HTML + JavaScript)
<!DOCTYPE html>
<html>
<head><title>WebSocket Chat</title>
</head>
<body><input type="text" id="messageInput"><button onclick="sendMessage()">Send</button><ul id="messageList"></ul><script>var socket = new WebSocket('ws://localhost:8080');socket.onmessage = function(event) {var messageList = document.getElementById('messageList');var li = document.createElement('li');li.textContent = event.data;messageList.appendChild(li);};function sendMessage() {var messageInput = document.getElementById('messageInput');var message = messageInput.value;socket.send(message);messageInput.value = '';}</script>
</body>
</html>
这个示例实现了一个简单的实时聊天应用,用户可以在输入框中输入消息并发送,其他用户能够即时收到消息并显示在页面上。
结论
WebSocket是一种强大的实时通信协议,它能够在客户端和服务器之间建立持久的双向通信通道,为项目中的实时通信场景提供了极大的便利。通过本文的介绍和示例,相信读者对WebSocket有了更深入的理解,能够更加灵活地运用WebSocket解决实际的项目需求。
相关文章:
深入理解WebSocket:实时双向通信的利器
一、介绍 1.1 基础概念介绍 单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。全双…...

Gateway是什么?(SpringCloudAlibaba组件)
1、网关介绍 **网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。**网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可…...

阿里巴巴拍立淘API新功能揭秘:图片秒搜商品,实现智能化个性化购物新体验
在数字化快速发展的今天,智能化和个性化已经成为购物体验中不可或缺的元素。为了满足消费者日益增长的购物需求,阿里巴巴中国站不断推陈出新,其中拍立淘API的新功能——图片秒搜商品,无疑为智能化个性化购物体验开创了新的篇章。 …...
蚓链为移动实体经济加油!
在当今数字化时代,数据已成为企业宝贵的资产之一。如何利用数据资产为可移动实体经济创造更多的增值机会呢?蚓链将为你揭示 11种行之有效的方法! 1. 个性化服务:根据客户数据,提供量身定制的产品和服务,满…...

MySQL 核心模块揭秘 | 12 期 | 创建 savepoint
回滚操作,除了回滚整个事务,还可以部分回滚。部分回滚,需要保存点(savepoint)的协助。本文我们先看看保存点里面都有什么。 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者&…...

SpringMVC --- 老杜
1、什么是SpringMVC? SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的及部分,…...
详细介绍如何利用 A star(A*)算法解决8数码问题
文章目录 1. A star(A*)算法简介2. 利用A*解决8数码问题(含Python代码)2.1 什么是8数码问题2.2 A*算法中的开放列表和关闭列表2.3 A*算法解决8数码问题过程2.3.1 计算节点(棋盘顺序)间距离2.3.2 交换数字生成新的节点2.3.3 A*主求解程序1. A star(A*)算法简介 A ∗ A^*…...

如何锁定鼠标光标在水平、垂直或45度对角线模式下移动 - 鼠标水平垂直移动锁定器简易教程
在我们进行精细工作例如如创建图标和图形设计时,通常需要我们对鼠标移动进行精确控制。一旦向左或向右轻微移动,都可能导致设计出错。若出现不必要的错误,我们极有可能不得不重新开始,这会令人感到非常沮丧。这种情况下࿰…...
在 Docker 部署的 MySQL 容器内安装和使用 vim
在 Docker 部署的 MySQL 容器内安装和使用 vim 文章目录 在 Docker 部署的 MySQL 容器内安装和使用 vim步骤一:进入 MySQL 容器步骤二:更新软件源和安装 vim步骤三:验证 vim 安装步骤四:使用 vim 进行文件编辑步骤五:保…...

人工智能|深度学习——基于Xception实现戴口罩人脸表情识别
一、项目背景 近年来,随着人工智能技术的不断发展,人脸表情识别已经成为了计算机视觉领域中的重要研究方向之一。然而,在当前的疫情形势下,佩戴口罩已经成为了一项必要的防疫措施,但是佩戴口罩会遮挡住人脸的部分区域&…...

【HTML】简单制作一个动态3D正方体
目录 前言 开始 HTML部分 JS部分 CSS部分 效果图 总结 前言 无需多言,本文将详细介绍一段代码,具体内容如下: 开始 首先新建文件夹,创建两个文本文档,其中HTML的文件名改为[index.html],JS的文件名改…...

Linux 常用指令及其理论知识
个人主页:仍有未知等待探索-CSDN博客 专题分栏:http://t.csdnimg.cn/Tvyou 欢迎各位指教!!! 目录 一、理论知识 二、基础指令 1、ls指令(列出该目录下的所有子目录和文件) 语法: …...

论文阅读——Sat2Vid
Sat2Vid: Street-view Panoramic Video Synthesis from a Single Satellite Image 提出了一种新颖的方法,用于从单个卫星图像和摄像机轨迹合成时间和几何一致的街景全景视频。 即根据单个卫星图像和给定的观看位置尽可能真实地、尽可能一致地合成街景全景视频序列。…...
js怎样判断status
相信大家都知道Switch开关吧,他有两种状态,通常用1/2表示,开启时为true,关闭时为false,那么我们该怎样判断他是否为开启还是关闭你? 我们可以声明一个变量,让它等于status,判断它是否等于1/2&…...

多态.Java
(1)什么是多态? 同类型的对象,表现出不同的形态。前者指父类,后者指不同的子类 说简单点,就是父类的同一种方法,可以在不同子类中表现出不同的状态,或者说在不同子类中可以实现不同…...
SSL根证书是什么
根证书是什么? 根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。 从技术上讲,证书其实包含三部分,用户的信息,用户的公钥,还有CA中心对该证书里面的信息的签名&#…...

大模型量化技术-GPTQ
大模型量化技术-GPTQ 2022年,Frantar等人发表了论文 GPTQ:Accurate Post-Training Quantization for Generative Pre-trained Transformers。 这篇论文详细介绍了一种训练后量化算法,适用于所有通用的预训练 Transformer模型,同时只有微小的性能下降。 GPTQ算法需要通过…...

NzN的数据结构--实现双向链表
上一章中,我们学习了链表中的单链表,那今天我们来学习另一种比较常见的链表--双向链表!! 目录 一、双向链表的结构 二、 双向链表的实现 1. 双向链表的初始化和销毁 2. 双向链表的打印 3. 双向链表的头插/尾插 4. 双向链表的…...
easyexcel-获取文件资源和导入导出excel
1、获取本地资源文件,根据模板填充数据导出 public void exportExcel(HttpServletResponse httpResponse, RequestBody AssayReportDayRecordQuery query) {AssayReportDayRecordDTO dto this.queryByDate(query);ExcelWriter excelWriter null;ExcelUtil.config…...

Android Monkey自动化测试
monkey一般用于压力测试,用户模拟用户事件 monkey 基本用法 adb shell monkey [参数] [随机事件数]monkey常用命令 -v:用于指定反馈信息级别,总共分三个等级-v -v -vadb shell mokey -v -v -v 100-s:用于指定伪随机数生成器的种…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...