当前位置: 首页 > news >正文

【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)

概述

本文为 WebSocket 协议的第六章,本文翻译的主要内容为 WebSocket 消息发送与接收相关内容。

有兴趣了解该文档之前几章内容的同学可以见:

  • 【译】WebSocket 协议——摘要( Abstract )
  • 【译】WebSocket 协议第一章——介绍( Introduction )
  • 【译】WebSocket 协议第二章——一致性要求( Conformance Requirements )
  • 【译】WebSocket 协议第三章——WebSocket网址( WebSocket URIs )
  • 【译】WebSocket 协议第四章——连接握手( Opening Handshake )
  • 【译】WebSocket 协议第五章——数据帧(Data Framing)

发送与接收消息(协议正文)

6.1 发送数据

为了通过 WebSocket 连接发送一条 WebSocket 消息,终端必须遵循以下几个步骤:

  1. 终端必须保证 WebSocket 连接处于 OPEN 状态(见第 4.1 节和第 4.2.2 节)。如果 WebSocket 连接的任意一端的状态发生了改变,终端必须中止以下步骤。
  2. 终端必须将数据按照第 5.2 节定义的 WebSocket 帧进行封装。如果需要发送的数据过大或者在终端希望开始发消息时,如果数据在整体性这一点上不可用,那么终端可能会选择通过在第 5.4 节中定义的一系列帧来进行封装。
  3. 包含数据的第一帧操作码(帧操作码)必须根据第 5.2 节中的内容设置的合适的值,以便接收者将数据解析为文本或者二进制数据。
  4. 最后一个包含数据的帧的 FIN ( FIN 帧)字段必须和第 5.2 节中定义的一样设置为 1 。
  5. 如果数据被发送到了客户端,数据帧必须和第 5.3 节中定义的一样添加掩码。
  6. 如果在 WebsSocket 连接中有协商扩展(第 9 章),在这些扩展中的定义和注意事项也许要额外考虑。
  7. 被格式化的帧必须通过底层的网络连接进行传输。

6.2 接收数据

为了接收 WebSocket 数据,终端需要监听底层网络连接。输入的数据必须通过第 5.2 节定义的 WebSocket 帧进行解析。如果收到了一个控制帧(第 5.5 节),那么这个帧必须如 5.5 节中定义的方式进行处理。如果收到的是一个数据帧,那么终端必须注意 5.2 节中的定义在操作码(帧操作码)中的数据类型。在这一帧中的“应用数据”被定义为消息的数据。如果帧中包含未分片的数据(第 5.4 节),那么就认为:一条 WebSocket 消息的数据和类型被收到了。如果帧是分片数据的一部分,那么随后的帧包含的“应用数据”连起来就是数据的格式。当通过 FIN 字段(FIN帧)表示的最后一个片段被收到时,我们可以说:一条 WebSocket 消息的数据(由片段组装起来的“应用数据”数据组成)和类型(注意分片消息的第一帧)已经被收到了。接下来的数据帧必须是属于一条新的 WebSocket 消息。

扩展(第 9 章)可能改变数据如何理解的方式,具体包括消息的内容边界。扩展,除了在“应用数据”之前添加“扩展数据”之外,也可以修改“应用数据”(例如压缩它)。

像第 5.3 节中说的那样,服务端在收到客户端的数据帧时必须去除掩码。

相关文章:

  • shell各种括号用途总结
  • 简易的RPC调用框架(大神写的)
  • 捕捉Web页面子类错误堆栈中的信息
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • 2010年9月blog汇总:敏捷个人和模型驱动开发
  • Eclipse:应该掌握的快捷键
  • 图像处理时用的卷积函数
  • asp.net web api
  • 各浏览器对页面外部资源加载的策略
  • 收藏 c#小函数
  • 解决Page.FindControl方法找不到指定控件 转
  • 二台电脑之间数据库文件进行备份
  • Oracle 发布 NoSQL 数据库
  • IBM Java多线程 - 5.同步详细信息
  • Google 是如何开发 Web 框架的
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【剑指offer】让抽象问题具体化
  • bearychat的java client
  • ES2017异步函数现已正式可用
  • Java IO学习笔记一
  • JAVA并发编程--1.基础概念
  • java第三方包学习之lombok
  • laravel5.5 视图共享数据
  • LeetCode18.四数之和 JavaScript
  • Nodejs和JavaWeb协助开发
  • 安装python包到指定虚拟环境
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 关于 Cirru Editor 存储格式
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 如何正确理解,内页权重高于首页?
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # 数据结构
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • %@ page import=%的用法
  • (39)STM32——FLASH闪存
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 获取url的方法
  • .Net多线程总结
  • .net与java建立WebService再互相调用
  • /3GB和/USERVA开关
  • /etc/fstab 只读无法修改的解决办法
  • ??myeclipse+tomcat
  • [.NET 即时通信SignalR] 认识SignalR (一)