当前位置: 首页 > news >正文

WebSocket:实现实时双向通信的技术

WebSocket是一种网络通信协议,它在单个TCP连接上提供全双工通信。WebSocket协议在2011年被IETF(互联网工程任务组)标准化为RFC 6455,并由W3C(万维网联盟)制定了WebSocket API标准,使得客户端(通常为浏览器)和服务器之间能够建立持久连接,并进行字节流式的双向通信。使用WebSocket可以使得服务器主动向客户端推送数据,客户端也可以随时向服务器发送数据。

WebSocket与HTTP的关系

WebSocket协议最初是作为HTML5规范的一部分引入的,但它可以独立于HTML5使用。虽然WebSocket协议与HTTP协议都基于TCP,但WebSocket协议与HTTP协议有本质的区别:

  1. 持久连接: HTTP协议通常是一次性的请求-响应模式,即客户端发起请求,服务器响应后连接通常关闭。而WebSocket连接一旦建立,会一直保持打开状态直到客户端或服务器主动关闭连接,允许双向通信。

  2. 双工通信: HTTP协议是“半双工”,即客户端可以请求服务器,服务器可以响应请求,但同一时刻只能进行单向数据传输。而WebSocket协议是“全双工”的,客户端和服务器都可以随时发送数据给对方。

建立WebSocket连接

WebSocket连接的建立通常通过一个被称为“握手”的过程,该过程通常基于HTTP协议。以下是WebSocket握手过程:

  1. 客户端发起握手请求: 客户端发送一个HTTP请求,包含一些特殊请求头,请求升级为WebSocket协议。

    请求头示例:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXB1ZSBub25jZQ==
    Origin: http://example.com
    Sec-WebSocket-Version: 13
    
    • Upgrade:表示请求升级协议为WebSocket。
    • Connection:值为Upgrade,表示连接需要“升级”。
    • Sec-WebSocket-Key:是一个Base64编码的16字节随机值,用于确保客户端和服务器都支持WebSocket。
    • Sec-WebSocket-Version:通常为13,表示WebSocket协议的版本。
  2. 服务器响应握手: 如果服务器支持WebSocket协议,它会返回一个HTTP 101状态码,并升级协议为WebSocket。

    响应头示例:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    
    • Sec-WebSocket-Accept:是使用客户端发送的Sec-WebSocket-Key和一个固定字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11连接起来,经过SHA-1哈希处理和Base64编码生成的值,以验证握手是否成功。

WebSocket通信

握手成功后,客户端和服务器就可以在建立的WebSocket连接上通过“帧”(frame)的形式进行双向通信。每个帧通常包含以下信息:

  • 操作码(Opcode): 指示帧的类型,如文本帧(Text frame)为0x1,二进制帧(Binary frame)为0x2,关闭连接帧(Close frame)为0x8等。
  • 掩码: 只有客户端发送给服务端的帧是掩码的,服务端发送给客户端的帧通常不掩码。
  • 有效载荷长度: 表示有效载荷的数据长度。
  • 有效载荷数据: 实际传输的数据内容。

WebSocket API

在客户端,通常使用JavaScript的WebSocket API来进行通信。以下是一个简单的JavaScript示例:

// 创建一个新的WebSocket连接到指定的服务器
const socket = new WebSocket('ws://example.com/chat');// 连接打开事件
socket.addEventListener('open', (event) => {socket.send('Hello Server!');
});// 接收消息事件
socket.addEventListener('message', (event) => {console.log('Message from server:', event.data);
});// 连接关闭事件
socket.addEventListener('close', (event) => {if (event.wasClean) {console.log(`Connection closed cleanly, code=${event.code}, reason=${event.reason}`);} else {console.error('Connection died');}
});// 连接错误事件
socket.addEventListener('error', (event) => {console.error('WebSocket error observed:', event);
});

WebSocket的优势

  1. 实时性: 由于连接是持久的,并且支持实时双向通信,WebSocket特别适用于需要实时数据更新的应用,如在线游戏、实时聊天、股票行情、协同编辑等。

  2. 降低延迟: 由于避免了HTTP连接建立和关闭的开销,并减少了成功通信所需的数据包数量,WebSocket在延迟方面比传统的HTTP轮询和长轮询(long polling)具有显著优势。

  3. 降低带宽消耗: WebSocket连接建立后,每次通信只需发送数据本身,相比于HTTP每次都需要发送完整的请求头和响应头,在频繁通信的情况下能显著减少带宽消耗。

WebSocket的局限性

  1. 浏览器兼容性: 虽然现代浏览器都支持WebSocket,但在一些老旧的浏览器上可能不支持或不完全支持。

  2. 代理和防火墙: 由于WebSocket使用不同于HTTP的端口(通常使用ws://为80端口,wss://为443端口),一些网络代理和防火墙可能不支持WebSocket连接或错误地关闭这些连接。

  3. 实现复杂度: 相较于简单的HTTP请求-响应模式,WebSocket需要服务器端实现更复杂的连接管理和消息处理逻辑。

WebSocket的安全性

对于需要保证数据安全的场景,应使用安全的WebSocket连接,协议使用wss://,类似于HTTPS。其握手过程同样通过TLS加密,确保数据在传输过程中不被窃听或篡改。例如:

const socket = new WebSocket('wss://example.com/chat');

服务器端实现

在服务器端,许多常用的Web服务器和编程语言都支持WebSocket。例如:

  • Node.js: 可以使用wssocket.io等库。
  • Java: 可以使用Java-WebSocket库或支持WebSocket的应用服务器如Tomcat、Jetty。
  • Python: 可以使用websocketsTornado等库。
  • C#: 可以使用WebSocket类(在System.Net.WebSockets命名空间中)。

总结

WebSocket协议为实现客户端与服务器间的实时双向通信提供了一种高效、低延迟的解决方案。它的设计使得其特别适用于需要频繁数据交互的实时应用场景。尽管存在浏览器兼容性和网络环境的挑战,WebSocket仍然是构建实时应用的首选技术之一。随着Web应用的不断发展,WebSocket的应用前景将越来越广泛。

相关文章:

WebSocket:实现实时双向通信的技术

WebSocket是一种网络通信协议,它在单个TCP连接上提供全双工通信。WebSocket协议在2011年被IETF(互联网工程任务组)标准化为RFC 6455,并由W3C(万维网联盟)制定了WebSocket API标准,使得客户端&am…...

探索 HumanoidBench:类人机器人学习的新平台

在科技飞速发展的当下,类人机器人逐渐走进我们的视野,它们有着和人类相似的外形,看起来能像人类一样在各种环境里完成复杂任务,潜力巨大。但实际上,让类人机器人真正发挥出实力,还面临着重重挑战。 这篇文…...

「数据可视化 D3系列」入门第十一章:力导向图深度解析与实现

D3.js 力导向图深度解析与实现 力导向图核心概念 力导向图是一种通过物理模拟来展示复杂关系网络的图表类型,特别适合表现社交网络、知识图谱、系统拓扑等关系型数据。其核心原理是通过模拟粒子间的物理作用力(电荷斥力、弹簧引力等)自动计…...

「数据可视化 D3系列」入门第八章:动画效果详解(让图表动起来)

动画效果详解 一、D3.js动画核心API1. d3.transition()2. transition.duration()3. transition.delay()4. 其他重要API 二、动画实现原理三、完整动画示例解析1. 柱状图生长动画2. 文本跟随动画 四、动画效果优化技巧1. 缓动函数选择:2. 组合动画:3. 动画…...

index: 自动化浏览器智能体

GitHub:https://github.com/lmnr-ai/index 更多AI开源软件:https://www.aiinn.cn/ 在做浏览器自动化脚本时,我们常常需要编写大量代码来处理复杂的网页交互,不仅耗时耗力,还难以调试和优化,要是出错更是难以…...

网页端调用本地应用打开本地文件(PDF、Word、excel、PPT)

一、背景原因 根据浏览器的安全策略,在网页端无法直接打开本地文件,所以需要开发者曲线救国。 二、实现步骤 前期准备: 确保已安装好可以打开文件的应用软件,如,WPS; 把要打开的文件统一放在一个文件夹&am…...

如何批量在多个 Word 文档末尾添加广告页面

Word是我们日常使用非常频繁的文档编辑软件,凭借其强大的文本处理功能,如文字输入、格式设置、段落排版、图片插入等,可以帮助我们轻松创建专业且美观的文档。不过呢当我们需要将这些文档分享给他人时,往往需要在每个文档的末尾添…...

JavaScript原生实现简单虚拟列表

旧笔记,最近使用时做了点新优化,之前只发在了个人博客上 地址:JavaScript原生实现简单虚拟列表 背景 在公司项目中,需要给商品配置大量的属性值,可能其中一个属性的值数量就有成百上千条。 一个商品会有很多属性&…...

安心联车辆管理平台应用前景分析

安心联车辆管理平台凭借其技术创新与行业适配能力,展现出广阔的应用前景。以下从技术驱动、行业覆盖、实际效益、市场策略及未来潜力五个维度进行分析: 一、技术驱动的核心竞争力 高精度定位与多传感器融合 安心联采用北斗/GPS双模定位技术,实…...

力扣每日打卡 2176. 统计数组中相等且可以被整除的数对(简单)

力扣 2176. 统计数组中相等且可以被整除的数对 简单 前言一、题目内容二、解题方法1. 暴力解法2.官方题解官方也是暴力解法 前言 这是刷算法题的第十三天,用到的语言是JS 题目:力扣 2176. 统计数组中相等且可以被整除的数对(简单) 一、题目内容 给你一…...

OpenStack Yoga版安装笔记(22)Swift笔记20250418

一、官方文档 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、对象存储简介(Introduction to Object Storage) OpenStack 对象存储&a…...

Linux 线程互斥

目录 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量的接口 初始化互斥量 互斥量加锁和解锁 锁的封装 ​编辑 互斥量加锁的非阻塞版本 互斥量实现原理探究 可重入VS线程安全 概念 常见的线程不安全的情况 常见的线程安全的情况 常见的不可重入的情况 常见的…...

webgl入门实例-12WebGL 投影矩阵 (Projection Matrix)基本概念

WebGL 投影矩阵 (Projection Matrix) 投影矩阵是将3D场景从视图空间(相机空间)转换到裁剪空间的关键矩阵,它决定了3D物体如何投影到2D屏幕上。 投影矩阵的作用 定义3D空间到2D平面的映射方式确定视景体(view frustum)的形状和范围实现透视效果(近大远小)或正交投…...

《实战AI智能体》——邮件转工单的AI自动化

💡 为什么使用 邮件转工单(AI自动化)模板 想象一下,您的邮箱像是一个繁忙的宇宙港口,每封邮件都是一艘载着信息的飞船。当这些飞船抵达时,我们的自动化系统就像是一位高效的宇宙调度员,迅速将每艘飞船(邮件)转化为一艘艘探索号(工单),并为它们分配勇敢的宇航员(…...

YOLOv8 Bug 及解决方案汇总 【2024.1.24更新】【环境安装】【训练 断点续训】OMPError / KeyError

YOLOv8 Bug 及解决方案汇总:深入解析与应对 引言 YOLOv8作为一款高性能的目标检测算法,在实际应用中难免会遇到各种各样的问题。本文将对YOLOv8常见的Bug进行汇总,并提供相应的解决方案,旨在帮助开发者更好地使用和优化YOLOv8。…...

健康养生:开启活力生活新篇章

在当代社会,熬夜加班、久坐不动、外卖快餐成为许多人的生活常态,随之而来的是各种亚健康问题。想要摆脱身体的疲惫与不适,健康养生迫在眉睫,它是重获活力、拥抱美好生活的关键。​ 应对不良饮食习惯带来的健康隐患,饮…...

Yocto项目实战教程 · 第4章:4.3小节-层

🔍 B站相应的视频教程: 📌 Yocto项目实战教程-第4章-4.3小节-层 记得三连,标为原始粉丝。 在 Yocto 项目中,元数据(Metadata)不仅是构建系统的核心驱动力,更是实现高度定制化、可移植…...

小红书爬虫,小红书api,小红书数据挖掘

背景: 小红书(Xiaohongshu)是一款结合社交、购物和内容分享的移动应用,近年来在中国以及全球范围内拥有大量的用户群体。小红书上的内容包括用户的消费体验、生活方式、旅行分享、时尚搭配等。通过这些内容,用户可以了…...

选择 iOS 按键精灵无根有根越狱辅助工具的理由

节省成本​ 使用 iOS 按键精灵,每台设备可为你减少 5 - 10 元的签名成本。对于需要使用大量脚本或者多设备操作的用户来说,长期下来能够节省一笔可观的费用。​ 不断更新优化​ 按键精灵团队始终致力于产品的更新与优化。新版本不断增加新功能&#x…...

电脑里的AI帮手:Open Interpreter智能助手食用指南

Open Interpreter简介如下: interpreter是一个使用python开发的命令行工具,可以让你在终端中使用类似AI对话的方式,只需简单输入指令要求,即可自动编写程序、执行代码,实现各种自动化操作interpreter有自动检测输出结…...

Windows软件界面分析软件-控件识别工具

Inspect.exe 这是微软提供的一款 UI 自动化检查工具,主要用于开发和测试应用程序的辅助功能(Accessibility)及 UI 自动化。 主要功能: 查看界面元素的属性(如名称、角色、状态、位置等)。 支持 UIA&…...

iOS 冷启动时间监控:启动起点有哪些选择?

⏱️ iOS 冷启动时间监控:启动起点有哪些选择? 作者:侯仕奇 来源:sqi.io 在监控 iOS 冷启动性能时,一个关键问题是:如何精确记录 App 冷启动的开始时间? 本文将对不同的“冷启动起点”监控方式…...

MacOS怎么显示隐藏文件

现象描述: 有些文件比如git的配置文件会作为隐藏文件存在。 Mac os默认是不显示隐藏文件的。 但是很多场合下我们需要查看或者编辑这些隐藏文件。 解决方法: 如下图所示,在Finder中使用Shift⇧Command⌘.快捷键 显示和隐藏都是同样的按…...

苹果紧急修复两个已被利用的iOS漏洞,用于针对特定目标的复杂攻击

苹果公司已发布iOS 18.4.1和iPadOS 18.4.1更新,修复两个被用于针对特定iPhone用户实施高度定向、复杂攻击的关键零日漏洞。 这两个漏洞存在于CoreAudio和RPAC组件中,攻击者可利用它们在受影响设备上执行任意代码或绕过安全保护机制。 两个正被活跃利用…...

8.观察者模式:思考与解读

原文地址:观察者模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在开发软件时,系统的某些状态可能会发生变化,而你希望这些变化能够自动通知到依赖它们的其他模块。你是否曾经遇到过,系统中某个对象…...

13.编码器的结构

从入门AI到手写Transformer-13.编码器的结构 13.编码器的结构代码 整理自视频 老袁不说话 。 13.编码器的结构 T r a n s f o r m e r E n c o d e r : 输入 [ b , n ] TransformerEncoder:输入[b,n] TransformerEncoder:输入[b,n] E m b e d d i n g : − > [ b , n , d ]…...

java 设计模式之模板方法模式

简介 模板方法模式:定义一个算法的基本流程,将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性, 模板方法中包含的角色: 抽象类:负责给出一个算法的基本流程,它由一个模板方法和若干个基本…...

C++面向对象

面向对象的思想 面向过程: 根据程序的执行过程,来设计软件的所有细节。面向过程的缺点:开发大型项目时,越来越难以把控,甚至失去控制。后期维护、更新成本很大。解决方案:使用面向对象。 什么是面向对象…...

守护进程编程

目录 一、守护进程 1.1 守护进程概述 1.2 守护进程的功能及特点 1.2.1 守护进程的功能 1.2.2 守护进程的特点 1.3 主要过程 1.4 阿里云服务器编程实现守护进程 1.4.1 daemon 命令 1.4.2 nohup命令 1.4.3 fork()编程实现 1.5 在树莓派中通过三种方式创建守护进程 1.5…...

【Spring Boot 源码学习】深入 ConfigurableEnvironment 的初始化过程

《Spring Boot 源码学习系列》 深入 ConfigurableEnvironment 的初始化过程 一、引言二、配置环境的初始化2.1 源码总览2.2 prepareEnvironment 方法2.2.1 获取或创建可配置环境2.2.2 配置环境并设置参数2.2.3 将配置属性源附加到环境中2.2.4 触发环境准备事件2.2.5 将DefaultP…...

若依集成BladeX单点登录的令牌管理与api请求流程

目录 概述系统架构单点登录流程令牌管理机制接口调用流程关键代码实现数据结构安全性考虑常见问题与解决 概述 本文档详细说明若依系统如何实现与BladeX的单点登录集成,包括令牌管理和接口调用的完整流程。整个集成采用基于OAuth2的授权码流程,允许用…...

54常用控件_QLCDNumber的属性

目录 代码示例: 倒计时 QLCDNumer 是一个专门用来显示数字的控件.类似于“老式计算器”的效果 核心属性 属性 说明 intValue QLCDNumber显示的数字值(int). value QLCDNumber 显示的数字值(double). 和intValue是联动的. 例如给value设为1.5, intValue的值就是2. 另外&a…...

IcePlayer音乐播放器项目分析及学习指南

IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...

【ELF2学习板】Ne10进行FFT测试

目录 引言 Ne10简介 交叉编译Ne10 测试 测试程序 测试结果 结语 引言 在上一篇博文介绍了FFTW在ELF2开发板的测试。其中我们提到--enable-neon选项在aarch64平台下无法启用。接下来测试一个专门用NEON指令优化的FFT库Ne10。 Ne10简介 NE10 是一个面向 ARM 架构的开源数…...

Android device PCO (protocol configuration options) intro

术语 英文缩写英文全称中文PCOprotocol configuration options协议配置选项RILradio interface layer 无线电接口层PCO介绍 PCO(Protocol Configuration Options) 是 3GPP 标准协议(TS 24.008)中定义的核心概念,用于在 LTE/5G 网络建立 PDN 连接时传递动态配置参数(如 D…...

HAL库通过FATFS和SDIO+DMA写入SD卡数据错误

HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据,但是发现写入的数据经常有错误,不是少了一部分就是多了一部分,写入的数据为csv格式,通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...

RK Android11 修改默认语言为法语及时区为巴黎时间

文章目录 1、需求2、解决 1、需求 客户要求将系统默认语言改为法语,系统默认时区改为巴黎时间(也称为欧洲中部时间)2、解决 --- a/build/make/tools/buildinfo.shb/build/make/tools/buildinfo.sh-46,7 46,7 echo "ro.product.cpu.ab…...

文件上传Ⅰ

文件上传--前后端验证 不让上传php,所以要绕过它 遇到网站可能不是php语言,会是java或者python语言等,它只能解析网站本身的语言,那我们就上传符合网站语言识别的格式(它能解析什么后缀,就上传什么后缀)&…...

IntelliJ IDEA clean git password

IntelliJ IDEA clean git password 清除git密码 方法一:(这个要特别注意啊,恢复默认设置,你的插件什么要重新下载了) File->Manage IDE Settings->Restore Default Settings以恢复IDEA的默认设置(可选); 清空…...

【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】

🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 💬 注意:本文在哈希函数中主讲除法散列法,乘法散列法、全域散列法、双重散列等自行了解。 &#x…...

论坛测试报告

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…...

人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身

随着科技的迅猛发展,人脸扫描这个词已经并不陌生,通过人脸扫描设备制作超写实人脸可以为影视制作打造逼真角色、提升游戏沉浸感,还能助力教育机构等领域生产数字人以丰富教学资源,还在安防、身份识别等领域发挥关键作用&#xff0…...

统计字符串每个字符出现频率

输入一个字符串&#xff0c;统计每个字符的出现频率&#xff0c;然后判断最大频率与最小频率的差值 cnt&#xff1a; 如果 cnt 是质数&#xff0c;则输出 "Lucky Word" 和 差值&#xff1b; 否则输出 "No Answer" 和 0。 #include <bits/stdc.h> u…...

SQL-子查询

SQL子查询是嵌套在另一个SQL查询中的SELECT语句&#xff0c;将内部查询的结果作为外部查询的条件或者数据源。 核心概念 子查询是一个完整的SELECT语句&#xff0c;可以嵌入到其他查询的where, from, SELECT, HAVING等子句中&#xff0c;用于动态生成条件或临时数据集。 例如…...

Python(21)Python日期时间完全指南:从基础到实战注意事项

目录 一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法则 三、企业级应用案例3.1 全球日志分析系统3.2 金融交易时间校验 四、六大核心注意事项1. 时区意识优先原则‌2. 时间戳的精度陷阱‌3. 夏令时转换三步骤4. 日期格式化安全指南‌5. 性…...

【医学影像 AI】早产儿视网膜病变国际分类(第三版)

【医学影像 AI】早产儿视网膜病变国际分类&#xff08;第三版&#xff09; 0. 论文简介0.1 基本信息0.2 摘要0.3 缩略语0.4 ICROP3的关键内容总结 1. 引言2. 血管化位置&#xff1a;区域&#xff08;ZONE&#xff09;3. 加重病变与前加重病变4. 急性病变分期&#xff08;阶段1-…...

焊接机器人的设计

一、引言 随着制造业的发展&#xff0c;焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点&#xff0c;能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人&#xff0c;对于提高焊接生产的自动化水平和产品质量具有重要意…...

SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端

SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端SQL存储过程入门&#x1f525; - 人生得E不早朝 深度思考完成 用时28秒 好的&#xff0c;用户的问题是&#xff1a;SQL Server里面是否可以通过插入存储过程来操作TCP或WebSocket&…...

利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类

一、需求背景 在农业现代化进程中&#xff0c;作物健康监测对于保障粮食安全和提高农业生产效率起着举足轻重的作用。马铃薯作为全球重要的粮食作物之一&#xff0c;其种植面积广泛&#xff0c;产量和质量直接关系到众多农户的生计以及食品供应链的稳定。准确、快速地鉴别马铃…...

文章记单词 | 第39篇(六级)

一&#xff0c;单词释义 themselves [əmˈselvz] pron. 他们自己&#xff1b;她们自己&#xff1b;它们自己&#xff1b;&#xff08;用以加强语气&#xff09;他们亲自&#xff0c;她们亲自&#xff0c;它们亲自&#xff1b;&#xff08;反身代词&#xff09; 指某人或某物本…...