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 main

import (
	"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 main

import (
	"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

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

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

相关文章

NX二次开发获取圆弧的四个象限点

我是用来用来画水路线框的UF_MODL_ask_curve_points()可以按弧长或者弧度获取曲线的等分点,取PI/2的圆弧,即将圆弧四等分,你也可以取任意等分点。 int GetArcPoint(tag_t arc_tag,double point[4][3]) {if(arc_tag0)r…

KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)

文章目录 1、登录kubesphere平台2、redis部署分析3、redis容器启动代码4、kubesphere平台部署redis4.1、创建redis配置集4.2、创建redis工作负载4.3、创建redis服务 5、测试连接redis 在kubesphere平台上部署redis应用都是基于redis镜像进行部署的,所以所有的部署操…

DRmare Music Converter - 一款高效的音乐转换工具,让您的音乐无处不在!

DRmare Music Converter是一款专业的音乐转换工具,旨在帮助用户更方便地管理和享受音乐。无论您是使用Mac还是Windows操作系统,DRmare Music Converter都能为您提供高效、便捷的音乐转换体验。 DRmare Music Converter支持多种音频格式的转换&#xff0…

伊恩·斯图尔特《改变世界的17个方程》波动方程笔记

主要是课堂的补充(yysy,我觉得课堂的教育模式真有够无聊的,PPT、写作业、考试,感受不到知识的魅力。 它告诉我们什么? 小提琴琴弦上某个小段的加速度,与相邻段相对于该段的平均位移成正比。 为什么重要&…

Studio One2024免费版下载及入门教程分享

众所周知,Studio One是一个专业的音频编辑软件,近几年随着音视频剪辑越来越火,Studio One也逐渐被人们所熟知。最近,就有许多小伙伴私信我,寻求Studio One的入门教程。 这不,今天小编就给大家带来了音频剪…

一个好用的工具,对网工来说是绝杀技!

上午好,我是老杨。 提到用人,很多单位和管理者第一反应都是应聘者的能力。能力到底怎么界定,其实每个人都有不同的判定标准。 在我看来,做事专注,且能尽可能“偷懒”的网工 ,就是我个人筛选员工的标准。 …

Python seaborn库的边框设置(Seaborn篇-02)

Python seaborn库的边框设置(Seaborn篇-02)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 …

RT-Thread Studio学习(十七)虚拟串口

RT-Thread Studio学习(十七)虚拟串口 一、简介二、新建RT-Thread项目并使用外部时钟三、启用USB设备功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下实现USB虚拟串口。 硬件及开发环境如下: OS WI…

AI学习(2): PyTorch2.x环境安装

1.介绍 注:下面是对PyTorch进行了简单的介绍,不喜欢可直接跳过。 1.1 什么是PyTorch PyTorch是一个由Facebook人工智能研究团队开发的开源机器学习库,用于开发人工智能和深度学习的应用程序。PyTorch支持广泛的机器学习和深度学习算法,并基于…

Flink Kubernetes Operator 介绍

一、简介 Flink Kubernetes Operator是针对在Kubernetes上运行Apache Flink应用程序而设计的工具。它充分利用了Kubernetes的优势,实现了对Flink集群的弹性管理和自动化操作,通过扩展Kubernetes API的方式,提供了管理和操作Flink部署的功能。…

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的创建过程与其表示分离,使得同样的构建过程可以创建不同的表示形式。 主要角色: 产品(Product):表示正在构建…

git提权

实验环境——vulnhub-dc2靶场 git提权 前提:用户可以使用sudo中git权限 查看sudo权限 sudo -l可以发现git命令存在sudo提权 基于此进行权限提升 方式: sudo git help config #在末行命令模式输入 !/bin/bash 或 !sh #完成提权 sudo git -p help…

海外问卷调查怎么做?

大家好,我是橙河老师,我自己做海外问卷项目已经2年时间了,一般来说互联网项目的生命周期都不会太长,但海外问卷项目是一个稳定长期可做的项目,只要消费市场一直存在,问卷调查的需求就不会消失,我…

DBA技术栈MongoDB:简介

1.1 什么是MongoDB? MongoDB是一个可扩展、开源、表结构自由、用C语言编写且面向文档的数据库,旨在为Web应用程序提供高性能、高可用性且易扩展的数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当…

深度学习记录--偏差/方差(bias/variance)

误差问题 拟合神经网络函数过程中会出现两种误差:偏差(bias)和方差(variance) 偏差和误差的区别 欠拟合(underfitting) 当偏差(bias)过大时,如左图,拟合图像存在部分不符合值,称为欠拟合(underfitting) 过拟合(overfitting) …

gitlab 部署项目新分支

公司代码管理平台新切换到gitlab下,上线发版流程随之变更 1新建分支,开发完成,提交新分支 2.去gitlab平台上找到Merge requests 3 点击右上角的New merge request select source branch 选择新建的分支 点击 compare branches and contin…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-热门标签推荐显示实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

Wayfair 开启2024年的裁员模式

周五的时候 Wayfair 的 CEO 公开信中表示,将削减 1650 个工作岗位。 通篇读下来的意思就是公司目前还是非常健康的状态,新冠导致的在线购物激增让 Wayfair 在短时间内的销售从 90 亿美元增加到 180 亿美元。 几乎是翻倍了,而且这个让 Wayfai…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-帖子详情页实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…