WebSocket知识点笔记(一)
WebSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务端之间的消息传递更加高效,允许服务器主动向客户端推送数据。
一.WebSocket全双工通信
WebSocket提供了真正的双向通信,客户端和服务端可以同时发送和接收消息
1.1传统HTTP模型 vs WebSocket全双工模型
1.1.1 HTTP请求/响应模型
1.客户端发起请求,服务器响应
2.每次通信都需要建立新的TCP连接,增加了延迟
3.服务器不能主动向客户端推送数据,只能在客户端请求时响应
1.1.2 WebSocket全双工通信
1.单个TCP连接保持打开状态,用于双向通信
2.客户端和服务端可以随时发送消息,无需等待对方完成操作
3.服务器可以主动向客户端推送数据,实现真正的实时通信
1.2 全双工通信的工作原理
1.2.1 连接建立(通过HTTP升级请求实现协议转换)
客户端通过WebSocket对象发起连接请求,使用HTTP协议中的Upgrade头将连接升级为WebSocket协议,服务器同意升级后,返回101状态码,并保持连接打开,直到被显式关闭。
1.初始HTTP请求
客户端通过标准的HTTP协议发起一个请求,该请求包含一个Upgrade头,表示希望将连接升级为WebSocket协议
GET /chat HTTP/1.1Host: example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Sec-WebSocket-Version: 13
2.服务器响应
如果服务器支持WebSocket并同意升级,它会返回一个101状态码(Switching Protocols),并确认升级到WebSocket协议
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
3.连接保持打开
一旦握手成功,HTTP连接升级为WebSocket连接并保持打开状态,用于后续的双向通信,直到被显式关闭。
1.2.2 数据帧传输(使用帧结构封装数据,支持文本和二进制格式)
一旦连接建立,客户端和服务器可以在任何时候发送消息,消息以帧的形式进行传输,每个帧包含一个或多个数据包,客户端和服务器之间的消息传递是独立的,互不干扰的。
1.消息分帧
WebSocket使用帧(frame)来封装数据,每个帧包含一个或多个数据包,并且可以是文本或二进制数据。每个帧都有一个固定的头部结构,包括操作码(opcode)、负载长度等字段。
2.消息传递
客户端和服务器可以在任何时候发送帧,无需等待对方完成操作,发送的消息可以是完整的,也可以是分段的(多个帧组成一个完整的消息)。
3.控制帧
除了数据帧,WebSocket还定义了多种控制帧,如关闭帧(Close Frame)、Ping帧和Pong帧,用于管理和维护连接状态。
1.2.3 并发通信(客户端和服务器可以同时发送消息)
1.独立的数据流
WebSocket连接中的数据流是独立的,客户端和服务器可以同时发送和接收消息,互不干扰,这个特性使得双方可以在同一时间进行多任务处理,例如客户端发送用户输入的同时,服务器推送最新的通知。
1.2.4 连接管理(通过心跳机制和异常处理确保连接的稳定性和可靠性)
1.心跳机制
为了确保连接的有效性,WebSocket提供了心跳机制,客户端和服务端可以定期发送Ping和Pong帧来检测连接状态。如果一段时间内没有收到对方的响应,可以认为连接已断开,并采取相应的措施(如重连)。
2.异常处理
当出现网络故障或其他异常情况时,WebSocket连接可能会中断,此时客户端和服务器可以通过捕获异常时间(如onError和onClose)来进行处理。
例如,在Java中
@OnClosepublic void onClose(Session session){sessions.remove(session);broadcast("User "+session.getId()+" disconnected",session);}@OnErrorpublic void onError(Session session,Throwable error){error.printStackTrace();sessions.remove(session);broadcast("User "+session.getId()+" encountered an error :" + error.getMessage(),session);}
1.2.5 连接关闭
1.正常关闭
客户端或服务器可以主动发送关闭帧(Close Frame)来关闭连接,对方收到关闭帧后,也会发送一个关闭帧作为确认,然后双方关闭连接。
2.异常关闭
如果一方突然断开连接(如网络故障),另一方会在一定时间内检测到连接丢失,并触发关闭事件。
二.WebSocket的优缺点
2.1 WebSocket的优势
2.1.1 低延迟
相比于传统的HTTP请求/响应模式,WebSocket减少了通信延迟,因为不需要每次都建立新的连接,减少了每次通信的握手时间。
1.即时消息传递
在传统的HTTP请求/响应模型中,客户端必须先发起请求,服务器才能响应。而WebSocket连接一旦建立,服务器可以主动向客户端推送数据,无需等待客户端请求。
这种即时消息传递显著减少了通信延迟,特别适合需要实时更新的应用场景。
2.减少握手开销
每次HTTP请求都需要重新建立TCP连接,这会增加额外的握手时间,而WebSocket连接保持打开状态,减少了频繁建立和关闭连接的开销,从而减低延迟。
2.1.2 高效资源利用
单个连接可以处理多条消息,减少了频繁建立和关闭连接的开销。
1.单个连接多个用途
WebSocket使用单个TCP连接进行双向通信,避免了频繁创建和销毁连接带来的资源消耗。相比于轮询(polling)和长轮询(long polling),WebSocket显著减少了网络带宽和服务器资源的占用。
2.轻量级协议头
WebSocket协议头信息非常小,相比于HTTP协议头,减少了不必要的网络流量,进一步提高了效率。
2.1.3 实时性
服务器可以主动推送数据给客户端,非常适合需要实时更新的应用场景
1.服务器推送
WebSocket允许服务器主动向客户端推送数据,实现了真正的实时通信,这对于需要及时更新的应用非常重要。
2.事件驱动架构
客户端和服务器可以在任何时候发送消息,基于事件驱动的架构使得应用能够快速响应用户操作和服务器通知,提供更好的用户体验。
2.1.4 简化开发
1.易于实现
WebSocket提供了简单的API,使得开发者可以轻松地在客户端和服务器之间建立双向通信。
例如,在Java中使用WebSokcet只需少量代码+注解即可实现基本功能。
@ServerEndpoint("/chat")
public class ChatServer {private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());@OnOpenpublic void onOpen(Session session) {sessions.add(session);broadcast("User connected: "+ session.getId(),session);}@OnMessagepublic void onMessage(String message,Session session){broadcast("User "+session.getId()+" : "+message,session);}@OnClosepublic void onClose(Session session){sessions.remove(session);broadcast("User "+session.getId()+" disconnected",session);}@OnErrorpublic void onError(Session session,Throwable error){error.printStackTrace();sessions.remove(session);broadcast("User "+session.getId()+" encountered an error :" + error.getMessage(),session);}private void broadcast(String message,Session exclude){synchronized (sessions){for(Session session:sessions){try {if(session.equals(exclude)){continue;}session.getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();}}}}
}
2.丰富的库支持
许多编程语言和框架都提供了对WebSocket的良好支持,developer可以选择适合自己项目的库或框架,快速构建WebSocket应用。
2.1.5 增强用户体验
1.无缝交互
WebSocket的全双工通信使得应用可以更流程地与用户互动,提供无缝的用户体验。例如,在线聊天应用中,用户可以立即看到其他用户的回复,而无需刷新页面。
2.实时反馈
对于需要实时反馈的应用,如在线游戏或协作编辑工具,WebSocket可以确保用户操作得到即时响应,增强用户的参与感和满意度。
2.1.6 适用于多种应用场景
1.实时聊天室
WebSocket可以实现实时的消息传递,非常适合构建聊天室或即时通讯应用,无需轮询服务器,提供流程的聊天体验。
2.协作编辑工具
允许多个用户同时编辑同一个文档,并实时同步修改。
3.在线游戏
对于需要低延迟交互的游戏,WebSocket提供了更好的性能,确保玩家的操作和游戏状态同步更新。
4.金融数据更新
WebSocket可以用来实时推送最新的股票价格或其他金融数据,帮助用户及时做出决策。
5.物联网设备监控
实时监控设备状态并推送更新给客户端,提高设备管理的效率。
2.2 WebSocket的缺点
2.2.1 连接保持开销
1.长时间占用资源
WebSocket连接一旦建立,会一直保持打开状态,直到显示关闭,这可能导致服务器资源(如内存、文件描述符等)被长时间占用,尤其是在高并发场景下。
2.网络带宽消耗
虽然WebSocket协议头比较小,但长时间保持连接仍然会占用一定的网络带宽,特别是在大量用户同时在线的情况下。
2.2.2 防火墙和代理问题
1.企业级网络限制
某些企业或组织的防火墙和代理服务器可能会组织WebSocket连接,因为它们默认只允许HTTP/HTTPS流量通过,这种限制可能需要额外的配置或使用HTTPS WebSocket(wss://),但这增加了复杂性。
2.2.3 不支持断点续传
1.数据完整性问题
WebSocket不支持断点续传功能,如果连接意外中断,未完成的消息传输将丢失,需要重新发送整个消息。对于大文件传输或长时间的任务,这可能会导致效率低下或数据丢失。
2.2.4 浏览器兼容性
1.旧浏览器支持有限
尽管现代浏览器普遍支持WebSocket,但在一些老旧版本的浏览器中,WebSocket支持可能缺失或不稳定,developer可能需要提供回退机制(如轮询或长轮询)以确保兼容性。
2.2.5 复杂的错误处理
1.异常情况处理复杂
WebSocket连接可能会因为网络故障,服务器重启等原因突然断开,developer需要实现复杂的状态管理和重连逻辑,以确保应用的稳定性和可靠性。
2.心跳机制维护
为了确保连接的有效性,通常需要实现心跳机制(Ping/Pong帧)。虽然这有助于检测连接状态,但也增加了开发和维护的复杂性。
2.2.6 安全性考虑
1.加密需求
WebSocket默认不加密,必须通过WSS(WebSocket Secure)协议(使用TLS加密)来确保数据传输的安全性。实现WSS需要额外的配置和证书管理,增加了部署的复杂性。
2.跨域安全
WebSocket也面临跨域资源共享(CORS)的问题,需要在服务端进行适当的配置以确保安全访问。
2.2.7 不适合所有应用场景
1.非实时需求
对于不需要实时通信的应用场景,WebSocket可能是过度设计。例如,简单的表单提交或静态页面加载,使用传统的HTTP请求/响应模型更为合适。
2.高延迟容忍度
如果应用对延迟要求不高,或者可以接受一定的延迟,使用轮询或长轮询可能是更简单且有效的解决方案。
相关文章:
WebSocket知识点笔记(一)
WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务端之间的消息传递更加高效,允许服务器主动向客户端推送数据。 一.WebSocket全双工通信 WebSocket提供了真正的双向通信,客户端和服务端可以同时发送和接收消息 …...

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度
随着全球化的不断深入和市场需求的快速变化,企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本,并确保信息的透明度,成为了各大行业亟待解决的问题。而增强现实(AR)技术,特别…...
基于Springboot + vue实现的美发门店管理系统
💖学习知识需费心, 📕整理归纳更费神。 🎉源码免费人人喜, 🔥码农福利等你领! 💖常来我家多看看, 📕网址:扣棣编程, 🎉感谢支持常陪伴, 🔥点赞关注别忘记! 💖山高路远坑又深, 📕大军纵横任驰奔, 🎉谁敢横刀立马行? 🔥唯有点赞+关注成! �…...
springboot中配置logback-spring.xml
一、在src/main/resources目录下,也就是在classpath路径下创建logback-spring.xml 注:springboot框架自动配置,如果更换名称,可在配置文件指定该文件即可 <?xml version"1.0" encoding"UTF-8"?> <…...

从63 秒到 0.482 秒:深入剖析 MySQL 分页查询优化
在日常开发中,数据库查询性能问题就像潜伏的“地雷”,总在高并发或数据量庞大的场景下引爆。尤其是当你运行一条简单的分页查询时,结果却让用户苦苦等待,甚至拖垮了系统。这种情况你是否遇到过? 你可能会想࿱…...
细说机器学习算法之过拟合与欠拟合
系列文章目录 第一章:Pyhton机器学习算法之KNN 第二章:Pyhton机器学习算法之K—Means 第三章:Pyhton机器学习算法之随机森林 第四章:Pyhton机器学习算法之线性回归 第五章:Pyhton机器学习算法之有监督学习与无监督…...

C/C++ 虚函数
虚函数的定义 虚函数是指在基类内部声明的成员函数前面添加关键字 virtual 指明的函数虚函数存在的意义是为了实现多态,让派生类能够重写(override)其基类的成员函数派生类重写基类的虚函数时,可以添加 virtual 关键字,但不是必须这么做虚函…...
【3GPP】【5G】注销流程(Deregistration procedures)
1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 3.1.2 Deregistration procedures 3.1.2.1 UE-initiated Deregistration 3.1.2.2 Network-initiated Deregistration 3.1.2 Deregistration procedures 注销流程…...
【小游戏篇】三子棋游戏
硬控我一上午,小编还是太菜了,大家可以自行升级电脑难度,也可以升级游戏到五子棋 1.game.h #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3//初始化棋盘 void InitBoa…...
7-Zip Mark-of-the-Web绕过漏洞复现(CVE-2025-0411)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

2025年国产化推进.NET跨平台应用框架推荐
2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费(MIT License)的跨平台框架(支持Android、iOS、macOS 和 Windows多平台运行),是 Xamarin.Forms 的进化版,从移动场景扩展到…...

关于ARM和汇编语言
一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段:控制器器通过地址总线向存储器发送想要获取的指令的地址编号,存储器将指定的指令发送给处理器 译码阶段:控制器对指令进行分…...

2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)
原文链接: https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状,关键技术 创新方向,以及行业应用的具体情况,通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…...
QTableView和QTableWidget的关系与区别
QTableView 和 QTableWidget 都是 Qt 框架中用于显示表格数据的控件,但它们在设计和使用上有一些重要的区别。 QTableView 模型-视图架构:QTableView 是 Qt 模型-视图架构的一部分,它与模型(如 QStandardItemModel 或自定义的 QA…...

Java导出通过Word模板导出docx文件并通过QQ邮箱发送
一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器:总告警次数:{{ServerTotal}} 服务器IP:{{IPA}},总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}},总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…...

ESP8266 MQTT服务器+阿里云
MQTT私有平台搭建(EMQX 阿里云) 阿里云服务器 EMQX 搭建私有MQTT平台 1、搜索EMQX开源版本 2、查看各版本EMQX支持的UBUNTU版本 3、查看服务器Ubuntu版本 4、使用APT安装模式 5、按照官网指示安装并启动 6、下载安装MQTTX测试工具 7、设置云服务…...

css动画水球图
由于echarts水球图动画会导致ios卡顿,所以纯css模拟 展示效果 组件 <template><div class"water-box"><div class"water"><div class"progress" :style"{ --newProgress: newProgress % }"><…...
【设计模式-行为型】状态模式
一、什么是状态模式 什么是状态模式呢,这里我举一个例子来说明,在自动挡汽车中,挡位的切换是根据驾驶条件(如车速、油门踏板位置、刹车状态等)自动完成的。这种自动切换挡位的过程可以很好地用状态模式来描述。状态模式…...

2024.1.22 安全周报
政策/标准/指南最新动态 01 工信部印发《关于加强互联网数据中心客户数据安全保护的通知》 原文: https://www.secrss.com/articles/74673 互联网数据中心作为新一代信息基础设施,承载着千行百业的海量客户数据,是关系国民经济命脉的重要战略资源。…...

idea修改模块名导致程序编译出错
本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑: 通过idea菜单创建模块,并用idea菜单修改模块名,结构程序编译报错,出错的代码莫名奇妙。双击maven弹窗clean时,还是报错。因为模块是新建的&am…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

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

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...