WebSocket协议、与HTTP对比

WebSocket

也可前往本人的个人网站进行阅读

WebSocket 和 HTTP

WebSocket和HTTP协议一样,都是基于TCP协议实现的应用层协议。

HTTP协议通常是单边通信,主要用于传输静态文档、请求-响应通信,适用于Web浏览器加载网页、API调用等。然而WebSocket则是会主动给你发消息,实现实时双向通信,我们经常玩的游戏、使用的聊天软件什么采用的都是这个协议。

这里进行详细比较

共同点:

  1. 基于TCP: WebSocket和HTTP都是基于TCP协议的应用层协议,用于在客户端和服务器之间进行通信。
  2. 使用URI(统一资源标识符): 两者都使用统一资源标识符(URI)来标识资源或服务的位置。
  3. 都是面向应用层的协议: WebSocket和HTTP都属于应用层协议,用于在不同设备或应用程序之间进行通信。

不同点:

  1. 连接性和通信方式:
    • HTTP: 是一种无状态的请求-响应协议。每个HTTP请求都是独立的,服务器在每个请求之后会断开连接,需要在每次请求时重新建立连接。
    • WebSocket: 提供了全双工通信,允许客户端和服务器之间建立持久的连接,可以实现双向实时通信,而不需要为每个消息建立新的连接。
  2. 数据帧格式:
    • HTTP: 通常使用明文文本或基于二进制的数据传输,但每个请求和响应都具有特定的结构。
    • WebSocket: 使用帧(frame)的形式传输数据,可以是文本帧或二进制帧。
  3. 协议头和握手:
    • HTTP: 通过请求头和响应头来传递元数据信息,如请求方法、状态码等。
    • WebSocket: 在建立连接时,使用HTTP进行初始握手,然后切换到WebSocket协议。握手时使用特定的HTTP头部,如Upgrade和Connection。
  4. 目的和应用场景:
    • HTTP: 主要用于传输静态文档、请求-响应通信,适用于Web浏览器加载网页、API调用等。
    • WebSocket: 适用于需要实时、双向通信的应用场景,如实时聊天、在线游戏、股票市场数据更新等。

总的来说,WebSocket和HTTP都是网络通信中的重要协议,但它们在连接性、通信方式和应用场景等方面存在明显的区别。WebSocket更适合实时、双向通信,而HTTP主要用于请求-响应式的通信。

解析

接下来对此协议进行详细讲解,先看图:

https://asdxz.oss-cn-beijing.aliyuncs.com/pic/20240115181050.png

首先客户端(client)发送连接请求,通过HTTP发送到服务端,但是请求头会进行一定改变,比如:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

这其中包含了一些特殊的头部,比如 UpgradeConnection

服务器接收到这个请求后,如果支持WebSocket,就会回复一个HTTP 101状态码(切换协议)以及一些额外的头部,表示同意建立WebSocket连接

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

此过程则称为握手,服务端和客户端握手建立连接之后,连接将一直保持,直到其中一方终止

过程中的数据传输:客户端和服务器可以在连接上自由地发送文本或二进制数据帧。这些数据帧包含消息内容以及一些控制信息,如数据帧的类型和长度等

关闭连接:关闭连接时,终止方会发送一个特殊的关闭帧。

例子

以下是一个golang的例子

package mainimport ("log""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true},
}func handleConnections(w http.ResponseWriter, r *http.Request) {// 将HTTP连接升级为WebSocket连接conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Fatal(err)return}defer conn.Close()for {// 读取客户端发送的消息messageType, p, err := conn.ReadMessage()if err != nil {log.Println(err)return}// 将接收到的消息原样发送回客户端if err := conn.WriteMessage(messageType, p); err != nil {log.Println(err)return}}
}func main() {http.HandleFunc("/ws", handleConnections)log.Println("WebSocket server is running on :8080")err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("Error starting server: ", err)}
}

客户端

package mainimport ("fmt""log""github.com/gorilla/websocket"
)func main() {// 连接WebSocket服务器conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)if err != nil {log.Fatal(err)}defer conn.Close()// 向服务器发送消息message := []byte("Hello, WebSocket!")err = conn.WriteMessage(websocket.TextMessage, message)if err != nil {log.Fatal(err)}// 从服务器接收消息_, receivedMessage, err := conn.ReadMessage()if err != nil {log.Fatal(err)}// 打印接收到的消息fmt.Println("Received message from server:", string(receivedMessage))
}

最后效果:

https://asdxz.oss-cn-beijing.aliyuncs.com/pic/20240115224711.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)

一、翻译环境和运行环境​ 在ANSI C的任何一种实现中,存在两个不同的环境。​ 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。​ 第2种是执行环境,它用于实际执行代码。​ VS中编译器:cl.exe ;Linux中…

INTEWORK—PET 汽车软件持续集成平台

产品概述 INTEWORK-PET-CI是经纬恒润自主研发的汽车软件持续集成&持续交付平台,在传统的持续集成基础上深化了研运一体化(DevOps)的概念,将嵌入式软件中的拉取代码、检查、构建、测试、版本管理以及发布交付等环节串联起来&am…

【微信小程序独立开发 4】基本信息编辑

这一节完成基本信息的编辑和保存 首先完成用户头像的获取 头像选择 需要将 button 组件 open-type 的值设置为 chooseAvatar,当用户选择需要使用的头像之后,可以通过 bindchooseavatar 事件回调获取到头像信息的临时路径。 从基础库2.24.4版本起&…

初阶数据结构:顺序表

目录 1. 引子:线性表2. 简单数据结构:顺序表2.1 顺序表简介与功能模块分析2.2 顺序表的实现2.2.1 顺序表:存储数据结构的构建2.2.2 顺序表:初始化与空间清理(动态)2.2.3 顺序表:插入与删除数据2…

爬虫笔记(一):实战登录古诗文网站

需求:登录古诗文网站,账号+密码+图形验证码 第一:自己注册一个账号+密码哈 第二:图形验证码,需要一个打码平台(充钱,超能力power!)或…

信息登记小程序怎么做_重塑用户互动,开启全新营销篇章

信息登记小程序:重塑用户互动,开启全新营销篇章 在数字化浪潮中,小程序以其便捷、高效的特点,逐渐成为企业与用户之间沟通的桥梁。其中,信息登记小程序更是凭借其独特的定位,在众多小程序中脱颖而出。本文…

[C#]winform部署openvino调用padleocr模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR 【算法介绍】 OpenVINO和PaddleOCR都是用于计算机视觉应用的工具,但它们有不同的特点和用途。OpenVINO是一个由Intel开发的开源工具套件,主要用于加速深度学习推理,而PaddleOC…

LNMP环境下综合部署动态网站

目录 LNMP部署--nginx 搭建mysql数据库 安装mysql的过程: 部署PHP: ​编辑​编辑php的配置文件在哪 wordpress程序安装 LNMP部署--nginx 纯净--联网状态 环境变量中没有nginx 安装形式的选择: yum安装:自动下载安装包及…

贪心算法 ——硬币兑换、区间调度、

硬币兑换: from book:挑战程序设计竞赛 思路:优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

大数据质量管制规范示例

大数据质量管制规范示例 一、前提概要二、相关概念三、管理原则四、治理委员五、应用管理六、查验方式七、考核比率八、扣分标准九、责任划分十、追责范围十一、其它条例十二、总结 一、前提概要 在当今大数据信息时代,大数据平台(大数据平台开发规范示…

关于大模型学习中遇到的3

来源:网络 Embedding模型 随着大型语言模型的发展,以ChatGPT为首,涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快,却少有关注支撑许多大型语言模型应用落地的必不可少的Embed…

中仕教育:社会人员可以报名三支一扶吗?

三支一扶是针对高校应届毕业生的一种考试,社会人员并不满足报考条件,所以不能报考。 三支一扶报考条件: 1.应届毕业生或者毕业两年内未就业的往届毕业生。 2.专科以上学历 3.遵纪守法,作风良好。 不同地区的考试要求不同&…

【AJAX框架】AJAX入门与axios的使用

文章目录 前言一、AJAX是干什么的?二、AJAX的安装2.1 CDN引入2.2 npm安装 三、基础使用3.1 CDN方式3.2 node方式 总结 前言 在现代Web开发中,异步JavaScript和XML(AJAX)已经成为不可或缺的技术之一。AJAX使得网页能够在不刷新整个…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法:data() 和 c_str(),都是返回该字符串的const char类型,那如何转换成非const的char呢? 下面展示三种方法: 强转:char* char_test (char*)test.c_str();使用string的地址&#xff…

LeetCode 热题 100 | 双指针(下)

目录 42. 接雨水 1 方法一:我的方法 2 方法二:动态规划 3 方法三:双指针 菜鸟做题第一周,语言是 C 42. 接雨水 1 方法一:我的方法 Warning:这是我的智障做法,请勿模仿 我只能说它教会…

用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列,如:1 1 2 3 5 8 ... 其前两项为1,第3项开始,每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …

MySQL---视图索引

表定义: 学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:S…

Redis设置开机自启动

1.新建一个系统服务文件 首先输入命令:vi /etc/systemd/system/redis.service 进入vim后粘贴下方代码,注意查看地址是否一致。 ExecStart后面接的是你的redis-server的安装位置和redis配置文件的目录 [Unit] Descriptionredis-server Afternetwork.ta…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器,有时候需要启动SSH会话,启动的时候发现没反应,且事件日志显示:无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边,发现“无默…

2024最新最全:【CISP系列考试大纲】零基础入门到精通

CISP(Certified Information Security Professional)中文全称注册信息安全专业人员认证,是经中国信息安全测评中心依据中编办批准开展“信息安全人员培训与资质认证”的职能,推出的代表国家对信息安全专业人员能力认可的证书。 C…