WebSocket 详解:全双工通信的实现与应用

目录

一、什么是 WebSocket?(简介)

二、为什么需要 WebSocket?

三、HTTP 与 WebSocket 的区别

WebSocket 的劣势

WebSocket 的常见应用场景

WebSocket 握手过程

WebSocket 事件处理和生命周期


一、什么是 WebSocket?(简介)

        WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。通过 WebSocket API,浏览器和服务器只需完成一次握手,即可建立持久性连接,开始双向数据传输。

二、为什么需要 WebSocket?

(一)HTTP 的局限性

HTTP 协议是基于请求-响应模式设计的,适用于静态页面交互,但对于实时通信,它存在以下几个问题:

  • 单向通信:HTTP 协议是单向的,客户端必须发起请求,服务器才能响应。服务器无法主动向客户端推送消息。
  • 高延迟:为了获取最新数据,客户端需要不断地发送请求(轮询)检查是否有新数据。这会造成明显的延迟,无法满足实时通信需求。
  • 资源浪费:即使使用长轮询,服务器也需要保持连接直至有新数据可发送,消耗大量服务器资源。频繁的请求还会浪费带宽和服务器处理能力。
(二)WebSocket 的优势
  1. 全双工通信
    WebSocket 支持双向通信,客户端和服务器可以在同一个连接上同时发送和接收消息。与 HTTP 单向请求-响应模式相比,WebSocket 提供了更高效的通信机制,特别适用于需要频繁数据交换的场景。

  2. 长连接
    WebSocket 建立连接后会保持连接持续开启,直到客户端或服务器主动关闭连接。相比 HTTP 中频繁的连接建立和断开,WebSocket 通过长连接提高了性能,减少了开销。

  3. 低延迟
    WebSocket 在建立连接后,消息传输延迟极低。服务器可以主动推送数据给客户端,避免了客户端频繁请求的延迟。

  4. 减少网络开销

  • 减少握手和头部信息:WebSocket 的握手过程只发生在连接建立时,之后数据帧的头部信息较小。相比之下,HTTP 的每个请求都需要携带完整的头部,开销较大。
  • 减少带宽消耗:WebSocket 显著减少了带宽消耗,尤其在与 HTTP 轮询或长轮询相比时,WebSocket 可以更加高效地利用网络资源。
     5.其他优点
  1. 实时功能的实现
    WebSocket 天然支持实时功能,例如:

    • 实时消息推送
    • 实时互动(如在线聊天)
    • 数据同步等
  2. 支持二进制数据
    WebSocket 不仅支持传输文本数据,还能高效地处理二进制数据(如图像、音频、视频等),这使得它在多媒体应用中表现尤为优秀。

  3. 跨平台支持
    WebSocket 是一种标准协议,被广泛支持于各种语言、框架和平台(如 JavaScript、Python、Java 等)。无论是前端浏览器还是后端服务器,都可以轻松实现 WebSocket 功能。

  4. 安全性
    WebSocket 支持通过 TLS/SSL 协议的 WSS 保障数据传输的安全性。此外,还可以结合身份验证机制(如 JWT)或 IP 限制等措施来防止滥用。

三、HTTP 与 WebSocket 的区别

特点WebSocketHTTP
通信方式双向通信单向请求/响应模式
连接类型长连接,连接保持打开短连接,每次请求需新建连接
实时性高,低延迟中等,轮询或长轮询增加延迟
效率数据传输轻量,性能高每次请求头部信息冗余,开销大
适用场景实时推送、聊天、游戏、物联网等静态内容加载、API 调用

WebSocket 的劣势

  1. 复杂性较高

  • 协议实现复杂:与传统的 HTTP 模型相比,WebSocket 协议需要额外的握手过程,并且要求服务器支持 WebSocket 协议。
  • 开发难度:实现双向通信的逻辑,并处理连接生命周期、断线重连等问题,增加了开发难度。
  1. 资源消耗

  • 连接资源占用:WebSocket 需要长期占用服务器的连接资源,尤其在高并发场景中,服务器需维护大量的长连接,可能导致资源消耗增加。
  • 客户端性能开销:在移动设备或低性能设备上,保持 WebSocket 连接可能增加电量和网络资源消耗。
  1. 安全性问题

  • 身份认证不足:WebSocket 本身没有内置身份认证机制,需要额外实现安全验证(如使用 JWT 或 API Key)。
  • 攻击风险:如 DDoS 攻击、WebSocket 劫持、跨站点攻击等安全问题需要额外关注。
  1. 协议的兼容性问题

协议版本:虽然 WebSocket 是标准化协议,但与某些技术栈或库的版本不兼容可能会导致问题(例如旧版客户端和新版服务器之间的不兼容)。

WebSocket 的常见应用场景

  1. 实时聊天
    WebSocket 提供双向、实时的通信机制,适用于即时通讯应用,如聊天应用,使得消息能够迅速、可靠地传递。

  2. 实时协作
    用于实时协作工具,例如在线文档编辑、白板绘画、团队任务管理等,团队成员可以在同一页面上进行实时互动和更新。

  3. 实时数据推送
    用于股票行情、新闻快讯、实时天气信息等实时数据推送,服务器可以及时将数据推送给客户端,确保数据的及时性。

  4. 多人在线游戏
    实时双向通信机制适用于多人在线游戏应用,使得游戏服务器可以实时地传输游戏状态和玩家行为,确保游戏的实时互动。

  5. 在线客服
    WebSocket 可以用于在线客服系统,提供即时响应,减少等待时间,提升用户体验。

WebSocket 握手过程

WebSocket 握手过程是客户端和服务器建立 WebSocket 连接的关键步骤,包含以下几个阶段:

  1. 客户端发起握手请求
    客户端通过 HTTP 协议向服务器发起 WebSocket 握手请求,包含特殊的请求头字段,要求将连接从 HTTP 协议升级为 WebSocket 协议。

    主要请求头:

    • Upgrade: websocket:请求升级协议为 WebSocket。
    • Connection: Upgrade:表明希望升级连接。
    • Sec-WebSocket-Key:一个随机生成的 Base64 编码的字符串,用于协议安全性验证。
    • Sec-WebSocket-Version:表示支持的 WebSocket 协议版本。
    • Origin:可选,表示请求来源,防止跨站点攻击。
  2. 服务器响应握手请求
    服务器在接收到握手请求后,如果支持 WebSocket 协议,并同意协议升级,则返回 101 状态码,表示协议切换成功。

    主要响应头:

    • HTTP/1.1 101 Switching Protocols:表明协议已切换。
    • Sec-WebSocket-Accept:服务器用 SHA-1 加密客户端提供的 Sec-WebSocket-Key,并返回一个 Base64 编码后的值。
  3. WebSocket 连接建立
    客户端收到响应后确认协议切换成功,WebSocket 连接正式建立。

  4. 数据交换
    连接建立后,客户端和服务器可以通过 WebSocket 协议进行高效的双向通信。

  5. 连接关闭
    连接可由客户端或服务器发起关闭。WebSocket 协议定义了一个关闭帧,包含状态码表示关闭原因。

WebSocket 事件处理和生命周期(方法使用介绍)

WebSocket 连接的生命周期包括以下几个主要事件:

  1. onopen:连接成功时触发
    WebSocket 连接成功建立后,onopen 事件触发,客户端可以开始发送数据。
    作用:在连接建立时执行一些初始化操作(如发送第一个消息,记录日志等)。

    let ws = new WebSocket('ws://example.com/socket');
    ws.onopen = function(event) {
        console.log('Connection established');
        ws.send('Hello Server');
    };
    
  2. onmessage:接收到消息时触发
    每当服务器发送消息时,onmessage 事件触发,客户端可以处理消息。
    作用:用于处理服务器发来的数据。event.data 包含服务器传来的消息内容。

    ws.onmessage = function(event) {
        console.log('Received message:', event.data);
    };
    
  3. onclose:连接关闭时触发
    当 WebSocket 连接关闭时,onclose 事件触发,可以进行清理操作。
    作用:用于执行清理操作,如更新 UI 状态或重新连接等。

    ws.onclose = function(event) {
        if (event.was
    
  4. 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.8118https://blog.csdn.net/Future_yzx/article/details/145359554?sharetype=blogdetail&sharerId=145359554&sharerefer=PC&sharesource=Future_yzx&spm=1011.2480.3001.8118

总结

WebSocket 是一种强大的协议,适用于需要实时通信的应用场景。尽管在实现和资源消耗上有一定的不足,但高效、低延迟和实时性,使得它在现代网络应用中得到了广泛应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器人抓取与操作概述(深蓝)——1

工业机器人:① “臂”的形态 ② “手”的形态 ③ 视觉,力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作:插入、推和滑 抓取:两指(平行夹爪)抓取、灵巧手抓取 落地-产…

人物传记之新月篇

相关故事链接(及时更新):Python的那些事第四篇:编程中的智慧之光控制结构-CSDN博客 目录 1. C语言程序:增强版加密与解密工具 2. Python程序:增强版加密与解密工具 功能对比表格 详细功能解释 人物传记…

Tensor 基本操作4 理解 indexing,加减乘除和 broadcasting 运算 | PyTorch 深度学习实战

前一篇文章,Tensor 基本操作3 理解 shape, stride, storage, view,is_contiguous 和 reshape 操作 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started Tensor 基本使用 索引 indexing示例代码 加减…

2024收尾工作

目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆(优先级队列) 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…

【反悔堆】【hard】力扣871. 最低加油次数

汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,用数组 stations 表示。其中 stations[i] [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处,并且有 fueli 升汽油。 假设汽车油…

PWM频率测量方法

测量PWM(脉宽调制)信号的频率是嵌入式系统中的常见需求,尤其是在电机控制、LED调光、传感器信号处理等场景中。 在这里介绍两种测量PWM频率的方法:测频法与测周法。 1、测频(率)法 原理:在闸门…

银行卡三要素验证接口:方便快捷地实现银行卡核验功能

银行卡三要素验证API:防止欺诈交易的有力武器 随着互联网的发展,电子支付方式也越来越普及。在支付过程中,银行卡是最常用的支付工具之一。然而,在一些支付场景中,需要对用户的银行卡信息进行验证,以确保支…

常见字符串相关题目

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 目录 14.最长公共前缀 5.最长回文子串 67.二进制求和 43.字符串相乘 14.最长公共前缀 题目: 编写一个函数来查…

DeepSeek:突破传统的AI算法与下载排行分析

DeepSeek的AI算法突破DeepSeek相较于OpenAI以及其它平台的性能对比DeepSeek的下载排行分析(截止2025/1/28 AI人工智能相关DeepSeek甚至一度被推上了搜索)未来发展趋势总结 在人工智能技术飞速发展的当下,搜索引擎市场也迎来了新的变革。DeepS…

2025神奇的数字—新年快乐

2025年,一个神奇的数字,承载着数学的奥秘与无限可能。它是45的平方(45),上一个这样的年份是1936年(44),下一个则是2116年(46),一生仅此一次。2025…

搭建Spark分布式集群

1,下载 下载 spark-3.5.4-bin-without-hadoop.tgz 地址: https://downloads.apache.org/spark/spark-3.5.4/ 2,安装 通过虚拟机设置共享文件夹将需要的安装包复制到linux虚拟机中 localhost1。虚拟机的共享盘在 /mnt/hgfs/。 将共享盘安装…

2025春晚刘谦魔术揭秘魔术过程

2025春晚刘谦魔术揭秘魔术过程 首先来看全过程 将杯子,筷子,勺子以任意顺序摆成一排 1.筷子和左边物体交换位置 2.杯子和右边物体交换位置 3.勺子和左边物体交换位置 最终魔术的结果是右手出现了杯子 这个就是一个简单的分类讨论的问题。 今年的魔术…

通过高效的侦察发现关键漏洞接管整个IT基础设施

视频教程在我主页简介或专栏里 在这篇文章中, 我将深入探讨我是如何通过详细分析和利用暴露的端点、硬编码的凭据以及配置错误的访问控制,成功获取目标组织关键IT基础设施和云服务访问权限的全过程。 我们先提到目标网站的名称 https://*sub.domain*.co…

Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)

Java 基于 springboot 的校园选课小程序 博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇&…

计算机视觉-卷积

卷积-图像去噪 一、图像 二进制 灰度 彩色 1.1二进制图像 0 1 一个点可以用一个bit(0/1)来表示 1.2灰度图像 0-255 一个点可以用一个byte来表示 1.3彩色图像 RGB 表达一个彩色图像先说它的分辨率p/w(宽)和q/h(高…

【论文笔记】Fast3R:前向并行muti-view重建方法

众所周知,DUSt3R只适合做稀疏视角重建,与sapnn3r的目的类似,这篇文章以并行的方法,扩展了DUSt3R在多视图重建中的能力。 abstract 多视角三维重建仍然是计算机视觉领域的核心挑战,尤其是在需要跨不同视角实现精确且可…

基于SpringBoot的高校一体化服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

单片机基础模块学习——AT24C02芯片

一、EEPROM芯片 ROMRAM断电后数据保留断电后数据消失 因此,如果在断电后希望数据继续保留的话,就需要存储在EEPROM芯片中。 二、EEPROM芯片原理图 A0~A2与芯片地址相关连接到GND,为0GND 接地,VCC 正电源 WP——write protect写…

VSCode+Continue实现AI辅助编程

Continue是一款功能强大的AI辅助编程插件,可连接多种大模型,支持代码设计优化、错误修正、自动补全、注释编写等功能,助力开发人员提高工作效率与代码质量。以下是其安装和使用方法: 一、安装VSCode 参见: vscode安…

开源先锋DeepSeek-V3 LLM 大语言模型本地调用,打造自己专属 AI 助手

DeepSeek-V3是一个强大的混合专家 (MoE) 语言模型,总共有 671B 个参数。为了实现高效的推理和经济高效的训练,DeepSeek-V3 采用了多头潜在注意力机制 (MLA) 和 DeepSeekMoE 架构,这些架构在 DeepSeek-V2 中得到了彻底的验证。此外&#xff0c…