关于WebSocket学习记录(三)

数据传递:

一旦WebSocket客户端、服务端建立连接后,后续的操作都是基于数据帧的传递。

WebSocket根据opcode来区分操作的类型。比如0x8表示断开连接,0x0-0x2表示数据交互。

1、数据分片

WebSocket的每条消息可能被切分成多个数据帧。当WebSocket的接收方收到一个数据帧时,会根据FIN的值来判断,是否已经收到消息的最后一个数据帧。

FIN=1表示当前数据帧为消息的最后一个数据帧,此时接收方已经收到完整的消息,可以对消息进行处理。FIN=0,则接收方还需要继续监听接收其余的数据帧。

此外,opcode在数据交换的场景下,表示的是数据的类型。0x01表示文本,0x02表示二进制。而0x00比较特殊,表示延续帧(continuation frame),顾名思义,就是完整消息对应的数据帧还没接收完。

2、数据分片例子

直接看例子更形象些。下面例子来自MDN,可以很好地演示数据的分片。客户端向服务端两次发送消息,服务端收到消息后回应客户端,这里主要看客户端往服务端发送的消息。

第一条消息

FIN=1, 表示是当前消息的最后一个数据帧。服务端收到当前数据帧后,可以处理消息。opcode=0x1,表示客户端发送的是文本类型。

第二条消息

  1. FIN=0,opcode=0x1,表示发送的是文本类型,且消息还没发送完成,还有后续的数据帧。
  2. FIN=0,opcode=0x0,表示消息还没发送完成,还有后续的数据帧,当前的数据帧需要接在上一条数据帧之后。
  3. FIN=1,opcode=0x0,表示消息已经发送完成,没有后续的数据帧,当前的数据帧需要接在上一条数据帧之后。服务端可以将关联的数据帧组装成完整的消息。

连接保持+心跳:

WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没有断开。然而,对于长时间没有数据往来的连接,如果依旧长时间保持着,可能会浪费包括的连接资源。

但不排除有些场景,客户端、服务端虽然长时间没有数据往来,但仍需要保持连接。这个时候,可以采用心跳来实现。

  • 发送方->接收方:ping
  • 接收方->发送方:pong

ping、pong的操作,对应的是WebSocket的两个控制帧,opcode分别是0x90xA

举例,WebSocket服务端向客户端发送ping,只需要如下代码(采用ws模块)

原文地址:https://www.cnblogs.com/ybniu/p/12248637.html

时间: 2024-08-30 12:05:15

关于WebSocket学习记录(三)的相关文章

Windows API 编程学习记录<三>

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

Spring Boot学习记录(三)--整合Mybatis

Spring Boot学习记录(三)–整合Mybatis 标签(空格分隔): spring-boot 控制器,视图解析器前面两篇都已弄好,这一篇学习持久层框架整合. 1.数据源配置 数据源使用druid,maven引入相关依赖,包括spring-jdbc依赖,mysql依赖 1.转换问题 配置的过程要学会为什么这样配置,而不是只学会了配置.这里我们可以和以前的配置方式对比: 以前版本 <!--配置数据库连接池Druid--> <bean id="dataSource"

Mybatis学习记录(三)--Mybatis配置文件详解

关于mybatis的配置文件,主要有两个,一个是SqlMapperConfig.xml文件一个是mapper.xml文件,分别对这两个进行深入全面学习. 一.SqlMapperConfig.xml文件 1.标签概况 在SqlMapperConfig.xml中主要有以下标签,其中环境集合environments和spring整合后废除不用.objectFactory和plugins不经常使用. properties(属性) settings(全局配置参数) typeAliases(类型别名) ty

产品需求文档的学习记录(三)

我们通过思维导图将想法进行了结构化梳理,接下来我们就需要进行方案的可行性推演,验证产品功能是否可行,预估项目要花多少人力物力,因此我们就要通过原型设计进行相关需求的论证.一开始就撰写PRD文档,我们很难对产品进行各方面的评估,也无法得知方案的可行性,并且无法直观细致的考虑产品. 原型设计是帮助我们更细致的思考,并做各项需求的评估,同时也是将自己脑海里的想法进行输出,通过原型设计后,我们就可以进行产品宣讲了.相对于之前抽象的文字描述,原型则更加清晰产品的需求,设计和技术人员或者老板也能够更加直观的

c++学习记录(三)

c++面向对象记录(二) 1.继承 继承是面向对象程序设计的一个重要概念.继承指依据另一个类来定义一个类,就好像子女继承父母的基因.运用继承的方法,我们就不需要重新编写数据成员.已有的类称为基类,新建的类称为派生类或者子类. (1)子类定义 定义一个子类,使用格式: \\class 子类名: 访问修饰符 基类名 (2)访问控制和继承 子类可以访问基类中的非私有成员,不可访问私有成员.子类继承了除下列情况外基类的所有方法: ·基类的构造方法.析构方法和拷贝构造函数 ·基类的重载运算符 ·基类的友元

UNP学习记录---三次握手和四次挥手

三次握手: 1.服务器被动接受客户的连接请求,调用socket,bind,listen来完成,并且阻塞在accpet. 2.客户调用connect发起主动打开,客户发送一个SYN 3.服务器收到SYN,回复一个ACK和SYN. 4.客户回复一个ACK确认. 四次挥手: 1.客户调用close主动关闭,发送一个FIN. 2.服务器回复一个ACK 3.服务器调用close回复一个FIN 4.客户回复一个ACK 主动发起断连的那端会在最后保持一个TIME_WIAT状态. TIME_WAIT存在的理由:

ES6深入学习记录(三)编程风格

今天学习阮一峰ES6编程风格,其中探讨了如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,写出合理的.易于阅读和维护的代码. 1.块级作用域 (1)let 取代 var ES6 提出了两个新的声明变量的命令: let 和 const.其中,let 完全可以取代 var,因为两者语义相同,而且 let 没有副作用. 上面代码如果用 var 替代 let,实际上就声明了两个全局变量,这显然不是本意.变量应该只在其声明的代码块内有效,var 命令做不到这一点. va

WebSocket学习记录

参考资料: Java后端WebSocket的Tomcat实现 java WebSocket的实现以及Spring WebSocket 基于Java的WebSocket推送 基于GoEasy实现Java web实时数据推送 使用GoEasy实现web实时推送

python学习记录三

一.集合: list_1 = [1,4,5,7,3,6,7,9] list_1 = set(list_1) list_2 = set([2,6,0,66,22,8,4]) #交集 list_1.intersection(list_2) #list_1 & list_2 #并集 list_1.union(list_2) #list_1 | list_2 #差集 list_1.difference(list_2) #list_1 - list_2 list_2.difference(list_1)