WebSocket 详解:全双工通信的实现与应用
目录
一、什么是 WebSocket?(简介)
二、为什么需要 WebSocket?
三、HTTP 与 WebSocket 的区别
WebSocket 的劣势
WebSocket 的常见应用场景
WebSocket 握手过程
WebSocket 事件处理和生命周期
一、什么是 WebSocket?(简介)
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。通过 WebSocket API,浏览器和服务器只需完成一次握手,即可建立持久性连接,开始双向数据传输。
二、为什么需要 WebSocket?
(一)HTTP 的局限性
HTTP 协议是基于请求-响应模式设计的,适用于静态页面交互,但对于实时通信,它存在以下几个问题:
- 单向通信:HTTP 协议是单向的,客户端必须发起请求,服务器才能响应。服务器无法主动向客户端推送消息。
- 高延迟:为了获取最新数据,客户端需要不断地发送请求(轮询)检查是否有新数据。这会造成明显的延迟,无法满足实时通信需求。
- 资源浪费:即使使用长轮询,服务器也需要保持连接直至有新数据可发送,消耗大量服务器资源。频繁的请求还会浪费带宽和服务器处理能力。
(二)WebSocket 的优势
-
全双工通信
WebSocket 支持双向通信,客户端和服务器可以在同一个连接上同时发送和接收消息。与 HTTP 单向请求-响应模式相比,WebSocket 提供了更高效的通信机制,特别适用于需要频繁数据交换的场景。 -
长连接
WebSocket 建立连接后会保持连接持续开启,直到客户端或服务器主动关闭连接。相比 HTTP 中频繁的连接建立和断开,WebSocket 通过长连接提高了性能,减少了开销。 -
低延迟
WebSocket 在建立连接后,消息传输延迟极低。服务器可以主动推送数据给客户端,避免了客户端频繁请求的延迟。 -
减少网络开销
- 减少握手和头部信息:WebSocket 的握手过程只发生在连接建立时,之后数据帧的头部信息较小。相比之下,HTTP 的每个请求都需要携带完整的头部,开销较大。
- 减少带宽消耗:WebSocket 显著减少了带宽消耗,尤其在与 HTTP 轮询或长轮询相比时,WebSocket 可以更加高效地利用网络资源。
5.其他优点
-
实时功能的实现
WebSocket 天然支持实时功能,例如:- 实时消息推送
- 实时互动(如在线聊天)
- 数据同步等
-
支持二进制数据
WebSocket 不仅支持传输文本数据,还能高效地处理二进制数据(如图像、音频、视频等),这使得它在多媒体应用中表现尤为优秀。 -
跨平台支持
WebSocket 是一种标准协议,被广泛支持于各种语言、框架和平台(如 JavaScript、Python、Java 等)。无论是前端浏览器还是后端服务器,都可以轻松实现 WebSocket 功能。 -
安全性
WebSocket 支持通过 TLS/SSL 协议的 WSS 保障数据传输的安全性。此外,还可以结合身份验证机制(如 JWT)或 IP 限制等措施来防止滥用。
三、HTTP 与 WebSocket 的区别
| 特点 | WebSocket | HTTP |
|---|---|---|
| 通信方式 | 双向通信 | 单向请求/响应模式 |
| 连接类型 | 长连接,连接保持打开 | 短连接,每次请求需新建连接 |
| 实时性 | 高,低延迟 | 中等,轮询或长轮询增加延迟 |
| 效率 | 数据传输轻量,性能高 | 每次请求头部信息冗余,开销大 |
| 适用场景 | 实时推送、聊天、游戏、物联网等 | 静态内容加载、API 调用 |
WebSocket 的劣势
-
复杂性较高
- 协议实现复杂:与传统的 HTTP 模型相比,WebSocket 协议需要额外的握手过程,并且要求服务器支持 WebSocket 协议。
- 开发难度:实现双向通信的逻辑,并处理连接生命周期、断线重连等问题,增加了开发难度。
-
资源消耗
- 连接资源占用:WebSocket 需要长期占用服务器的连接资源,尤其在高并发场景中,服务器需维护大量的长连接,可能导致资源消耗增加。
- 客户端性能开销:在移动设备或低性能设备上,保持 WebSocket 连接可能增加电量和网络资源消耗。
-
安全性问题
- 身份认证不足:WebSocket 本身没有内置身份认证机制,需要额外实现安全验证(如使用 JWT 或 API Key)。
- 攻击风险:如 DDoS 攻击、WebSocket 劫持、跨站点攻击等安全问题需要额外关注。
-
协议的兼容性问题
协议版本:虽然 WebSocket 是标准化协议,但与某些技术栈或库的版本不兼容可能会导致问题(例如旧版客户端和新版服务器之间的不兼容)。
WebSocket 的常见应用场景
-
实时聊天
WebSocket 提供双向、实时的通信机制,适用于即时通讯应用,如聊天应用,使得消息能够迅速、可靠地传递。 -
实时协作
用于实时协作工具,例如在线文档编辑、白板绘画、团队任务管理等,团队成员可以在同一页面上进行实时互动和更新。 -
实时数据推送
用于股票行情、新闻快讯、实时天气信息等实时数据推送,服务器可以及时将数据推送给客户端,确保数据的及时性。 -
多人在线游戏
实时双向通信机制适用于多人在线游戏应用,使得游戏服务器可以实时地传输游戏状态和玩家行为,确保游戏的实时互动。 -
在线客服
WebSocket 可以用于在线客服系统,提供即时响应,减少等待时间,提升用户体验。
WebSocket 握手过程

WebSocket 握手过程是客户端和服务器建立 WebSocket 连接的关键步骤,包含以下几个阶段:
-
客户端发起握手请求
客户端通过 HTTP 协议向服务器发起 WebSocket 握手请求,包含特殊的请求头字段,要求将连接从 HTTP 协议升级为 WebSocket 协议。主要请求头:
Upgrade: websocket:请求升级协议为 WebSocket。Connection: Upgrade:表明希望升级连接。Sec-WebSocket-Key:一个随机生成的 Base64 编码的字符串,用于协议安全性验证。Sec-WebSocket-Version:表示支持的 WebSocket 协议版本。Origin:可选,表示请求来源,防止跨站点攻击。
-
服务器响应握手请求
服务器在接收到握手请求后,如果支持 WebSocket 协议,并同意协议升级,则返回 101 状态码,表示协议切换成功。主要响应头:
HTTP/1.1 101 Switching Protocols:表明协议已切换。Sec-WebSocket-Accept:服务器用 SHA-1 加密客户端提供的Sec-WebSocket-Key,并返回一个 Base64 编码后的值。
-
WebSocket 连接建立
客户端收到响应后确认协议切换成功,WebSocket 连接正式建立。 -
数据交换
连接建立后,客户端和服务器可以通过 WebSocket 协议进行高效的双向通信。 -
连接关闭
连接可由客户端或服务器发起关闭。WebSocket 协议定义了一个关闭帧,包含状态码表示关闭原因。
WebSocket 事件处理和生命周期(方法使用介绍)
WebSocket 连接的生命周期包括以下几个主要事件:
-
onopen:连接成功时触发
WebSocket 连接成功建立后,onopen事件触发,客户端可以开始发送数据。
作用:在连接建立时执行一些初始化操作(如发送第一个消息,记录日志等)。let ws = new WebSocket('ws://example.com/socket'); ws.onopen = function(event) {console.log('Connection established');ws.send('Hello Server'); }; -
onmessage:接收到消息时触发
每当服务器发送消息时,onmessage事件触发,客户端可以处理消息。
作用:用于处理服务器发来的数据。event.data包含服务器传来的消息内容。ws.onmessage = function(event) {console.log('Received message:', event.data); }; -
onclose:连接关闭时触发
当 WebSocket 连接关闭时,onclose事件触发,可以进行清理操作。
作用:用于执行清理操作,如更新 UI 状态或重新连接等。ws.onclose = function(event) {if (event.was -
onerror:发生错误时触发
onerror 事件在 WebSocket 连接出现错误时触发。
作用:用于捕获并处理 WebSocket 的错误,可能包括连接失败、数据传输失败等。let ws = new WebSocket('ws://example.com/socket'); ws.onerror = function(event) {console.error('WebSocket error:', event); };
WebSocket 心跳机制
详细参考下面博客:
https://blog.csdn.net/Future_yzx/article/details/145359554?sharetype=blogdetail&sharerId=145359554&sharerefer=PC&sharesource=Future_yzx&spm=1011.2480.3001.8118
https://blog.csdn.net/Future_yzx/article/details/145359554?sharetype=blogdetail&sharerId=145359554&sharerefer=PC&sharesource=Future_yzx&spm=1011.2480.3001.8118
总结
WebSocket 是一种强大的协议,适用于需要实时通信的应用场景。尽管在实现和资源消耗上有一定的不足,但高效、低延迟和实时性,使得它在现代网络应用中得到了广泛应用。
相关文章:
WebSocket 详解:全双工通信的实现与应用
目录 一、什么是 WebSocket?(简介) 二、为什么需要 WebSocket? 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket…...
神经网络|(二)sigmoid神经元函数
【1】引言 在前序学习进程中,我们已经了解了基本的二元分类器和神经元的构成,文章学习链接为: 神经网络|(一)加权平均法,感知机和神经元-CSDN博客 在此基础上,我们认识到神经元本身在做二元分类,是一种非…...
云原生:构建现代化应用的基石
一、什么是云原生? 云原生是一种构建和运行应用程序的方法,旨在充分利用云计算的分布式系统优势,例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点,能够更好地适应云平台的动态变化&…...
【浏览器 - Chrome调试模式,如何输出浏览器中的更多信息】
在开发过程中,如果不主动console.log,浏览器中的信息有些不会主动输出到 控制台console里面。这个如果是一些浏览器内部的接口调试,则会很麻烦。比如RTCPeerConnection过程 ,RTCPeerConnection属于浏览器内部的方法,其…...
不同操作系统(Windows、Linux)上安装和配置Tomcat的详细教程
以下是在不同操作系统(Windows、Linux)上安装和配置Tomcat的详细教程: Windows系统下Tomcat的安装与配置 下载Tomcat 访问Apache Tomcat官方网站(https://tomcat.apache.org)。在“Download”页面,根据需求选择合适的Tomcat版本。例如,选择“Core”下的zip压缩包下载。…...
MapReduce,Yarn,Spark理解与执行流程
MapReduce的API理解 Mapper 如果是单词计数:hello:1, hello:1, world:1 public void map(Object key, // 首字符偏移量Text value, // 文件的一行内容Context context) // Mapper端的上下文,…...
unity导入图片素材注意点和AI寻路模块导入
当我们导入了图片资源,我们需要设置为Sprite类型 UI资源的位置通常是Rect Transform 要进行转化: (imgHP.transform as RectTransform).sizeDelta new Vector2((float)hp / maxHP * hpW,74); RectTransform 是Unity中用于UI元素的特殊变换组件&#…...
单片机-STM32 IIC通信(OLED屏幕)(十一)
一、屏幕的分类 1、LED屏幕: 由无数个发光的LED灯珠按照一定的顺序排列而成,当需要显示内容的时候,点亮相关的LED灯即可,市场占有率很高,主要是用于户外,广告屏幕,成本低。 LED屏是一种用发光…...
Windows Docker Desktop安装及使用 Docker 运行 MySQL
Docker Desktop是Docker的官方桌面版,专为Mac和Windows用户设计,提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎,为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…...
开源RAG框架Kotaemon及其混合检索系统的优势与局限
开源RAG框架Kotaemon及其混合检索系统的优势与局限 大模型(LLMs)的快速发展令人瞩目,但如何让这些模型更有效地利用外部知识,一直是业界关注的焦点。检索增强生成(Retrieval-Augmented Generation,RAG&…...
Day21-【软考】短文,计算机网络开篇,OSI七层模型有哪些协议?
文章目录 OSI七层模型有哪些?有哪些协议簇?TCP/IP协议簇中的TCP协议三次握手是怎样的?基于UDP的DHCP协议是什么情况?基于UDP的DNS协议是什么情况? OSI七层模型有哪些? 题目会考广播域 有哪些协议簇&#x…...
Kmesh v1.0 正式发布!7 大特性提升网络流量管理效率和安全性
Kmesh v1.0 正式发布!7 大特性提升网络流量管理效率和安全性 2025 年新年伊始,Kmesh 团队正式发布了 Kmesh v1.0234。以下是 Kmesh v1.0 提升网络流量管理效率和安全性的 7 大特性35: 加密通信:引入 IPsec 协议对节点间流量加密&a…...
巧妙获取ListBox控件的选中条目(按点击顺序)
实例需求:用户窗体中有两个控件 列表框:ListBox1,支持多选按钮:CommandButton1 现在需要记录用户在列表框中选择顺序(不考虑选中后再次点击取消选中的操作),如下图所示。 Dim objDic As Objec…...
动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践
利用图神经网络进行节点分类:从理论到实践 前言 在之前的学习中,大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络(GNNs)来解决节点分类问题。在节点分类任务里,大家往往仅掌握少量节点的真实…...
Level DB --- TableBuilder
TableBuilder是Level DB里面重要的类和模块,它描述了数据如何序列化到文件中,以及数据里面的格式逻辑。它里面包含了之前介绍的多个模块和类。 data block、filter block和index block block格式,之前已经介绍过Level DB --- BlockBuilder-…...
Leecode刷题C语言之组合总和②
执行结果:通过 执行用时和内存消耗如下: int** ans; int* ansColumnSizes; int ansSize;int* sequence; int sequenceSize;int** freq; int freqSize;void dfs(int pos, int rest) {if (rest 0) {int* tmp malloc(sizeof(int) * sequenceSize);memcpy(tmp, seque…...
Hook 函数
什么是hook函数? 在计算机编程中,hook函数是指在特定的事件发生时被调用的函数,用于在事件发生前或后进行一些特定的操作。通常,hook函数作为回调函数被注册到事件处理器中,当事件发生时,事件处理器会自动…...
自然元素有哪些选择?
在设计浪漫风格的壁纸时,自然元素是营造温馨、梦幻氛围的关键。以下是一些常见的自然元素选择,以及它们在壁纸设计中的应用建议: 一、花朵 玫瑰: 特点:玫瑰是浪漫的象征,尤其是红色和粉色玫瑰,…...
【miniconda】:langraph的windows构建
langraph需要python3.11 langraph强烈建议使用py3.11 默认是3.12 官方 下载仓库 下载老版本的python (后续发现新版miniconda也能安装老版本的python) 在这里...
自动驾驶中的多传感器时间同步
目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考: 前言 对多传感器数据…...
15 分布式锁和分布式session
在java中一个进程里面使用synchronized在new出来对象头信息中加锁,如果是静态方法中在加载的类信息中加锁(我们在锁的原理中讲过)。如果使用lock加锁可以自己指定。这些都是在同一个进程空间中的操作。如果在分布式环境中由于程序不在一个进程空间,就没办…...
【蓝桥杯】43692.青蛙跳杯子
题目描述 X 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。 X 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个…...
[Dialog屏幕开发] 屏幕绘制(下拉菜单)
阅读该篇文章之前,可先阅读下述资料 [Dialog屏幕开发] Table Control 列数据操作https://blog.csdn.net/Hudas/article/details/145343731?spm1001.2014.3001.5501上篇文章我们的屏幕已实现了如下功能 我们已经设置了按钮对Table Control 列的数据进行了操作 接下…...
AIGC视频生成模型:慕尼黑大学、NVIDIA等的Video LDMs模型
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓,而慕尼黑大学同样不容小觑,…...
JVM常见知识点
在《深入理解Java虚拟机》一书中,介绍了JVM的相关特性。 1、JVM的内存区域划分 在真实的操作系统中,对于地址空间进行了分区域的设计,由于JVM是仿照真实的机器进行设计的,那么也进行了分区域的设计。核心区域有四个,…...
工业数据分析:解锁工厂数字化的潜力
工业数据分析:解锁工厂数字化的潜力 引言 工业数据分析是工业4.0时代的核心技术之一。从生产设备的传感器数据,到供应链的物流信息,工业环境中每天都会产生海量数据。这些数据蕴藏着巨大的潜力,能够帮助企业优化生产流程、降低运营成本、提高产品质量。 然而,如何高效地…...
类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件
目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写(overidde) 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…...
系统思考—问题分析
很多中小企业都在面对转型的难题:市场变化快,资源有限,团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时,他提到:“我们团队每天都很忙,但效率始终没见提升,感觉像是在…...
第24篇:Python开发进阶:掌握Python编程中的调试技巧
第24篇:调试技巧 内容简介 在软件开发过程中,调试是确保代码正确性和稳定性的关键步骤。有效的调试技巧不仅能帮助开发者快速定位和修复错误,还能提升代码的整体质量和可维护性。本篇文章将探讨如何使用Python内置的调试工具pdb进行调试&am…...
Midscene.js:重新定义UI自动化的新时代工具
前言 Midscene.js 是一个创新的、面向开发者的 UI 自动化解决方案,并通过人工智能技术简化自动化脚本的编写与维护。 它提供了三种核心方法——交互(.ai, .aiAction)、提取(.aiQuery)和断言(.aiAssert&am…...
