WebSocket是什么以及其与HTTP的区别

新钛云服已累计为您分享774篇技术干货

HTTP协议
HTTP是单向的,客户端发送请求,服务器发送响应。举个例子,当用户向服务器发送请求时,该请求采用HTTP或HTTPS的形式,在接收到请求后,服务器将响应发送给客户端,每个请求都与相应的响应相关联,在发送响应后,连接关闭,每次HTTP或HTTPS请求都会建立到服务器的新连接,并且在获得响应后,连接会自行终止。
HTTP是一种在TCP之上运行的无状态协议,TCP是一种面向连接的协议,它保证使用三方握手方法传递数据包,并重新传输丢失的数据包。
HTTP可以在任何可靠的面向连接的协议(如TCP、SCTP)之上运行。当客户端向服务器发送HTTP请求时,客户端和服务器之间的TCP连接是打开的,在得到响应后,TCP连接被终止,每个HTTP请求都会打开到服务器的单独TCP连接。例如,如果客户端向服务器发送10个请求,则10个单独的TCP连接将被打开,并在获得响应/回退后关闭。
以ASCII编码的HTTP消息信息,每个HTTP请求消息包括HTTP协议版本(HTTP/1.1、HTTP/2)、HTTP方法(GET/POST等)、HTTP标头(内容类型、内容长度)、主机信息等,以及包含正在传输到服务器的实际消息的主体。HTTP标头的大小从200字节到2KB不等,HTTP标头的常见大小为700-800字节。当Web应用程序在客户端使用更多的cookie和其他工具来扩展代理的存储功能时,它会减少HTTP标头负载。

图1 HTTP连接示意图
WebSocket
WebSocket是双向的,是一种全双工协议,用于相同的客户端-服务器通信场景,与HTTP不同,它从ws://或wss://开始。它是一个有状态的协议,这意味着客户端和服务器之间的连接将保持有效,直到任何一方(客户端或服务器)终止。客户端和服务器关闭连接后,连接将从两端终止。
让我们举一个客户端-服务器通信的例子,有一个客户端,它是一个Web浏览器和一个服务器,每当我们启动客户端和服务器之间的连接时,客户端-服务器都会进行握手,并决定创建一个新的连接,这个连接将保持有效,直到它们中的任何一个终止。当连接建立并处于活动状态时,使用相同的连接信道进行通信,直到通信终止。
这就是在客户端-服务器握手之后,客户端-服务器如何决定一个新的连接以保持其活动,这个新的连接将被称为WebSocket。一旦通信链路建立和连接打开,消息交换将以双向模式进行,直到客户端-服务器之间的连接持续存在。如果他们中的任何人(客户端服务器)宕机或决定关闭连接,双方都将关闭连接。套接字的工作方式与HTTP的工作方式略有不同,状态代码101表示WebSocket中的交换协议。

图2 WebSocket连接示意图
PART.01
何时使用WebSocket
1、实时Web应用:实时Web应用程序使用Web套接字在客户端显示数据,这些数据由后端服务器不断发送。在WebSocket中,数据被不断地推送/传输到已经打开的同一连接中,这就是为什么WebSocket更快并提高了应用程序性能。例如,在交易网站或比特币交易中,为了显示价格波动和移动数据,后端服务器使用WebSocket通道不断向客户端推送。
2、游戏应用程序:在游戏应用程序中,可能会关注这一点,服务器不断接收数据,在不刷新UI的情况下,它将在屏幕上生效,UI甚至在不建立新连接的情况下自动刷新,因此它在游戏应用程序中非常有用。
3、聊天应用程序:聊天应用程序使用WebSocket只建立一次连接,以便在订阅者之间交换、发布和广播消息。它重用相同的WebSocket连接,用于发送和接收消息以及进行一对一的消息传输。
PART.02
何时不使用WebSocket
如果我们想要通过网络传输任何实时更新或连续的数据流,可以使用WebSocket。
如果我们只想获取一次数据来用应用程序处理它,我们应该使用HTTP协议,只获取一次的数据可以通过简单的HTTP请求查询,所以在这种情况下,最好不要使用WebSocket。
推荐阅读


推荐视频
相关文章:
WebSocket是什么以及其与HTTP的区别
新钛云服已累计为您分享774篇技术干货 HTTP协议 HTTP是单向的,客户端发送请求,服务器发送响应。举个例子,当用户向服务器发送请求时,该请求采用HTTP或HTTPS的形式,在接收到请求后,服务器将响应发送给客户端…...
Flutter 实战:构建跨平台应用
文章目录 一、简介二、开发环境搭建三、实战案例:开发一个简单的天气应用1. 项目创建2. 界面设计3. 数据获取4. 实现数据获取和处理5. 界面展示6. 添加动态效果和交互7. 添加网络错误处理8. 添加刷新功能9. 添加定位功能10. 添加通知功能11. 添加数据持久化功能 《F…...
Python中68个内置函数的使用与归类
前言 在Python解释器中内置的、可以直接使用的函数。这些函数不需要额外的导入或安装,可以直接在Python代码中调用。Python内置函数包括了很多常用的功能,比如对数据类型的操作、数学运算、字符串处理、文件操作等。一些常见的内置函数包括print()、len…...
AGV無人搬送車控制系统Pytorn
import tkinter as tk import Main import monitoring # メインウィンドウを作成 root tk.Tk() root.title("AGV無人搬送車控制系统 ver1.0.0") # ウィンドウサイズを固定 root.geometry("501x340") root.resizable(False, False) # サイズ変更を…...
使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计
标题:Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源:IEEE TRANSACTIONS ON ELECTRON DEVICES(19年) 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…...
Android13分享热点设置安全性为wpa3
Android13分享热点设置安全性为wpa3 文章目录 Android13分享热点设置安全性为wpa3一、前言热点WPA3加密类型是需要底层硬件支持的。Wifi WPA3 和 热点 WPA3 是不一样的分享初衷 二、代码分析1、应用代码中热点设置WPA3 加密格式报错部分日志信息: 2、系统代码分析&a…...
2023-11-12 LeetCode每日一题(Range 模块)
2023-03-29每日一题 一、题目编号 715. Range 模块二、题目链接 点击跳转到题目位置 三、题目描述 Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。 半开区间 [left, right) 表示所有 left < x < right 的实数 x 。 实…...
【六袆 - Framework】Angular-framework;前端框架Angular发展的由来0001;
Angular发展介绍,Angular17新特性 官方文档Angular框架发展的由来何为结构化、模块化 Angular17新特性 English unit Embarking on the journey of deep technical learning requires a well-structured approach, applicable to any programming language. The key…...
JAVA集合学习
一、结构 List和Set继承了Collection接口,Collection继承了Iterable Object类是所有类的根类,包括集合类,集合类中的元素通常是对象,继承了Object类中的一些基本方法,例如toString()、equals()、hashCode()。 Collect…...
【Linux】语言层面缓冲区的刷新问题以及简易模拟实现
文章目录 前言一、缓冲区刷新方法分类a.无缓冲--直接刷新b.行缓冲--不刷新,直到碰到\n才刷新c.全缓冲--缓冲区满了才刷新 二、 缓冲区的常见刷新问题1.问题2.刷新本质 三、模拟实现1.Mystdio.h2.Mystdio.c3.main.c 前言 我们接下来要谈论的是我们语言层面的缓冲区&…...
Mac安装与配置eclipse
目录 一、安装Java:Mac环境配置(Java)----使用bash_profile进行配置(附下载地址) 二、下载和安装eclipse 1、进入eclipse的官网 (1)、点击“Download Packages ”编辑 (2)、找到macOS选择符合自己电脑的框架选项…...
TCP协议(建议收藏)
1. TCP特点 有连接:需要双方建立连接才能通信,在socket编程中服务端new ServerSocket(port)需要绑定端口,在客服端new Socket(serverIp, serverPort)与服务端建立连接可靠传输:确认应答机制,超时重传机制面向字节流&a…...
Interactive Analysis of CNN Robustness
Interactive Analysis of CNN Robustness----《CNN鲁棒性的交互分析》 摘要 虽然卷积神经网络(CNN)作为图像相关任务的最先进模型被广泛采用,但它们的预测往往对小的输入扰动高度敏感,而人类视觉对此具有鲁棒性。本文介绍了 Pert…...
Java,多线程,线程的通信机制
线程间通信的理解: 当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律地执行,那么多线程之间需要一些通信机制。可以协调它们的工作,以此实现多线程共同操作一份数据。 关于线程间的通信,以下代码为例&am…...
ArcGIS进阶:栅格计算器里的Con函数使用方法
本实验操作为水土保持功能重要性评价: 所用到的数据包括:土地利用类型数据(矢量)、植被覆盖度数据(矢量)和地形坡度数据(栅格)。 由于实验数据较少,其思路也较为简单&a…...
小程序多文件上传 Tdesign
众所周知,小程序文件上传还是有点麻烦的,其实主要还是小程序对的接口有诸多的不便,比如说,文件不能批量提交,只能一个个的提交,小程序的上传需要专门的接口。 普通的小程序的页面也比普通的HTML复杂很多 现…...
Java多线程锁
AQS 互斥锁,悲观锁 public class Demo1 {// 从0累加到1000 悲观锁static Integer num 0;public static void main(String[] args) {for (int i 0; i < 3; i) {Thread t new Thread(() -> {while (num < 1000) {synchronized (num.getClass()) {if (nu…...
【Docker】Web应用通过jar打包成WAR文件
把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c 创建war包 -v 显示过程信息 -f -M -0 这个是阿拉伯数字,只打包不压缩的意思 解压game.war jar -xvf game.war 解压到当前目录 环境 RedHat Linux 9 VWWare 8.0 SSH 3.2.9 Putty 0.62 问题…...
Elasticsearch 外部词库文件更新
本文所使用的ES集群环境可在历史文章中获取,采用docker部署的方式。 Elasticsearch 是一个功能强大的搜索引擎,广泛用于构建复杂的全文搜索应用程序。在许多情况下,为了提高搜索引擎的性能和精度,我们可以使用外部词库来定制和扩展…...
OpenTiny Vue 组件库支持 Vue2.7 啦!
之前 OpenTiny 发布了一篇 Vue2 升级 Vue3 的文章。 🖖少年,该升级 Vue3 了! 里面提到使用了 ElementUI 的 Vue2 项目,可以通过 TinyVue 和 gogocode 快速升级到 Vue3 项目。 有朋友评论替换button出错了,并且贴出了…...
RVC在音乐制作中的创新应用:人声伴奏分离+风格迁移案例
RVC在音乐制作中的创新应用:人声伴奏分离风格迁移案例 1. 引言:当AI遇见音乐创作 你有没有想过,把一首流行歌曲里的人声提取出来,然后用你喜欢的歌手的声音重新“唱”一遍?或者,把你自己的清唱࿰…...
从MobileViT到BERT:结构化剪枝如何帮你打造“小钢炮”模型?实战案例与调参避坑指南
从MobileViT到BERT:结构化剪枝实战与调参避坑指南 在移动端和边缘计算场景中,模型小型化已成为AI落地的关键瓶颈。当我们将参数量超过1亿的ViT或BERT部署到手机、嵌入式设备甚至普通GPU服务器时,内存占用大、推理延迟高、能耗超标等问题会集中…...
【操作系统】CTFos Pro-专为CTF优化的高性能虚拟机正式版
1. CTFos Pro虚拟机:专为CTF优化的高性能解决方案 如果你经常参加CTF比赛或者进行安全研究,肯定遇到过这样的烦恼:每次搭建环境都要耗费大量时间,各种工具安装配置让人头疼,不同比赛需要的环境还不一样。CTFos Pro就是…...
SpringCloud进阶--Seata与分布式事务某
起因是我想在搞一些操作windows进程的事情时,老是需要右键以管理员身份运行,感觉很麻烦。就研究了一下怎么提权,顺手瞄了一眼Windows下用户态权限分配,然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧ÿ…...
手把手教你用Cursor的.cursorrules文件,定制你的专属Python/React开发AI伙伴
用.cursorrules文件打造你的智能编程伙伴:Python/React开发者的终极配置指南 在当今快节奏的软件开发环境中,AI编程助手已经成为提升效率的必备工具。而Cursor作为其中的佼佼者,其真正的威力往往被大多数开发者所低估——通过精心设计的.curs…...
Nucleus Co-Op:重新定义单机游戏的多人同屏革命
Nucleus Co-Op:重新定义单机游戏的多人同屏革命 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 想象一下这样的场景:你和朋…...
突破PaddlePaddle飞桨Alstudio文件上传限制的3种高效方案
1. 为什么Alstudio会有文件上传限制? 第一次用PaddlePaddle飞桨Alstudio平台时,我兴冲冲地想把训练好的200M模型文件传上去测试,结果系统直接弹窗提示"文件大小超过150M限制"。当时整个人都懵了——这要怎么继续开发啊?…...
别再只会while(1)了!聊聊STM32裸机开发的6种实用架构,新手也能选对
STM32裸机开发的6种架构实战指南:从超级循环到事件驱动 第一次用STM32做温控器项目时,我把所有代码塞进了while(1)循环。两周后,当需要增加蓝牙控制和OLED界面时,代码已经变成了一团乱麻——按键检测延迟导致温度调节失灵…...
从‘找茬游戏’到智能识别:一文读懂VM BLOB分析里的连通性、阈值与特征筛选
从‘找茬游戏’到智能识别:解密BLOB分析中的连通性、阈值与特征筛选 想象一下,你正在玩一款经典的"找茬游戏"——在两幅看似相同的图片中,需要快速识别出细微的差异点。这种视觉搜索的过程,与机器视觉中的BLOB分析有着惊…...
TrollInstallerX实用指南:3分钟快速安装TrollStore的完整教程
TrollInstallerX实用指南:3分钟快速安装TrollStore的完整教程 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款专为iOS 14.0至16.6.1设…...
