5 webSocket

webSockets 简介


什么是 websocket

webSockets 是一种先进的技术;它可以在用户的浏览器和服务器之间打开交互式通信会话;使用此 API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应
websocket 是一种网络通信协议,是HTML5开始提供的一种在单个TCP连接上进行全双工通信的协议,这个对比着HTTP协议来说,HTTP协议是一种无状态的、无连接的、单向的应用层协议,通信请求只能由客户端发起,服务端对请求做出应答处理;HTTP协议无法实现服务器主动向客户端发起消息, websocket 连接允许客户端和服务器之间进行全双工通信, 以便任一方都可以通过建立的连接将数据推送到另一端;websocket只需要建立一次连接,就可以一直保持连接状态

webSockets 特点

  • 全双工: 通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合例如指A→B的同时B→A,是瞬时同步的
  • 二进制帧: 采用了二进制帧结构,语法、语义与HTTP完全不兼容,相比http/2, WebSocket更侧重于"实时通信",而HTTP/2更侧重于提高传输效率,所以两者的顿结构也有很大的区别;不像HTTP/2 那样定义流,也就不存在多路复用、优先级等特性;自身就是全双工,也不需要服务器推送
  • 协议名: 引入ws和wss分别代表明文和密文的websocket协议,且默认端口使用80或443,几乎与http一致
ws://www.chrono. com
ws://www.chrono. com:8080/srv
wss://www.chrono. com:445/im?user_id=xxx
  • 握手: websocket也要有一个握手过程,然后才能正式收发数据客户端发送数据格式如下
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-websocket-Key: dGh1IHNhbxBsZSBub25jzQ==
Origin: http://example.com
Sec-webSocket-Protocol: chat, superchat
Sec-websocket-Version: 13

服务端返回的数据格式

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
sec-websocket-Accept: s3pPLMBiTxaQ9kYGzzhzRbK+xo0=Sec-websocket-Protocol: chat
  • Connection:必须设置Upgrade,表示客户端希望连接升级
  • Upgrade:必须设置Websocket,表示希望升级到Websocket协议
  • Sec-WebSocket-Key:客户端发送的一个base64编码的密文,用于简单的认证秘钥。要求服务端必须返回一个对应加密的"Sec-WebSocket-Accept应答,否则客户端会抛出错误,并关闭连接
  • Sec-WebSocket-Version :表示支持的Websocket版本
  • HTTP/1.1 101 Switching Protocols:表示服务端接受WebSocket协议的客户端连接
  • Sec-WebSocket-Accep:验证客户端请求报文,同样也是为了防止误连接。具体做法是把请求头里"Sec-WebSocket-Key"的值,加上一个专用的UUID,再计算摘要

webSockets 优点

  • 较少的控制开销: 数据包头部协议较小,不同于http每次请求需要携带完整的头部
  • 更强的实时性: 相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少
  • 保持创连接状态: 创建通信后,可省略状态信息,不同于HTTP每次请求需要携带身份验证
  • 更好的二进制支持: 定义了二进制帧,更好处理二进制内容
  • 支持扩展: 用户可以扩展 WebSocket 办议、实现部分自定义的子协议
  • 更好的压缩效果: WebSocket 在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率

webSockets 应用场景

  • 弹幕
  • 媒体聊天
  • 协同编辑
  • 基于位置的应用
  • 体育实况更新
  • 股票基金报价实时更新

webSocket 常量


WebSocket.CONNECTING	0
WebSocket.OPEN	1
WebSocket.CLOSING	2
WebSocket.CLOSED	3

webSocket 属性


WebSocket.binaryType // 使用二进制的数据类型连接。
WebSocket.bufferedAmount 只读 // 未发送至服务器的字节数。
WebSocket.extensions 只读 // 服务器选择的扩展。
WebSocket.onclose // 用于指定连接关闭后的回调函数。
WebSocket.onerror // 用于指定连接失败后的回调函数。
WebSocket.onmessage // 用于指定当从服务器接受到信息时的回调函数。
WebSocket.onopen // 用于指定连接成功后的回调函数。
WebSocket.protocol 只读 // 服务器选择的下属协议。
WebSocket.readyState 只读 // 当前的链接状态。(常量)
WebSocket.url 只读 // WebSocket 的绝对路径。

webSocket 方法


WebSocket.close([code[, reason]]) // 关闭当前链接。
WebSocket.send(data) // 对要传输的数据进行排队。

webSocket 事件


使用 addEventListener() 或将一个事件监听器赋值给本接口的 oneventname 属性,来监听下面的事件。

close // 当一个 WebSocket 连接被关闭时触发。 也可以通过 onclose 属性来设置。
error // 当一个 WebSocket 连接因错误而关闭时触发,例如无法发送数据时。 也可以通过 onerror 属性来设置。
message // 当通过 WebSocket 收到数据时触发。 也可以通过 onmessage 属性来设置。
open // 当一个 WebSocket 连接成功时触发。 也可以通过 onopen 属性来设置。

webSocket 实现


// 创建 webSocket 连接
const socket = new WebSocket('ws://localhost:8080')// 连接成功触发
socket.addEventListener('open', function (event) {socket.send('Hello Server!') // 传输数据进行排队
})// 收到数据触发
socket.addEventListener('message', function (event) {console.log('Message from server ', event.data)
})// 连接发生错误触发
socket.addEventListener('error', function (event) {console.log('webSocket error', event)
})// 连接关闭时触发
socket.addEventListener('close', function (event) {console.log('webSocket close', event)
})

webSocket 实现库


  • μWebSockets
  • Socket.IO
  • WebSocket-Node

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

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

相关文章

【shell】为shell布置陷阱:trap捕捉信号

trap是Shell编程中的一种强大内置命令,‌用于捕获和处理信号。‌ 信号是操作系统用于与正在运行的程序进行通信的机制。‌当发生某些特定事件时,‌操作系统会发送信号给程序,‌例如用户按下CtrlC终止程序的运行。‌trap命令允许我们在Shell脚…

C++:模板类的继承

模板类的继承 1)类模板 继承 类模板 (2)类模板 继承 模板类 (3)类模板 继承 普通类 (4)普通类 继承 模板类 单模板参数&#xff0c;类模板继承类模板&#xff0c;代码实现 //作为父类 template <typename T> class People {private:/* data */int age;public:T x;Peopl…

【思科】链路聚合实验配置和背景

【思科】链路聚合实验配置和背景 背景链路聚合基本概念链路聚合聚合接口 思科链路聚合协议01.PAgP协议02.LACP协议 思科链路聚合模式LACP协议模式PAgP协议模式ON模式 实验准备配置二层链路聚合LACP协议模式SW1SW2PC1PC2查看LACP聚合组建立情况查看LACP聚合端口情况查看逻辑聚合…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(三)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

设计模式——模版方法和策略模式

前言 作为一名资深CV工程师&#xff0c;学会为自己减少工作量乃重中之重。但只是一味地CV&#xff0c;只会因为劣质代码而让自己的工作量加倍&#xff0c;为了将来不被繁重的维护工作而打扰自己的休息日&#xff0c;为了更好的节能&#xff0c;学习设计模式&#xff0c;刻不容缓…

数据结构_Map和Set

目录 一、搜索模型 二、Map 2.1 Map.Entry 2.2 Map 方法 2.3 Map 注意事项 三、Set 3.1 Set 方法 3.2 Set 注意事项 四、哈希表 4.1 哈希表 4.2 冲突 4.3 哈希函数设计 4.4 闭散列 4.5 开散列/哈希桶 总结 【搜索树】 二叉搜索树又称二叉排序树&#xff0c;它或…

spring-boot 整合 redisson 实现延时队列(文末有彩蛋)

应用场景 通常在一些需要经历一段时间或者到达某个指定时间节点才会执行的功能&#xff0c;比如以下这些场景&#xff1a; 订单超时提醒收货自动确认会议提醒代办事项提醒 为什么使用延时队列 对于数据量小且实时性要求不高的需求来说&#xff0c;最简单的方法就是定时扫描数据…

使用Pandas读取Excel文件将特定列转成str格式方法汇总

文章目录 读取Excel文件并确保列为字符串类型使用 dtype 参数使用 converters 参数 读取Excel文件的正确拼写示例&#xff1a;读取Excel文件并过滤包含特定值的行详细解释 读取Excel文件并确保列为字符串类型 正确的方法是使用 pd.read_excel 函数&#xff0c;并指定 dtype 或…

Webserver笔记

代码随想录的项目 LogStream.h // 返回data_ char数组的数据末尾地址 const char* end() const { return data_ sizeof data_; }Logging.cpp //定义一个 struct timeval 类型的变量 tv&#xff0c;用于存储当前的时间信息。 //定义一个 time_t 类型的变量 time&#xff0c;用…

语音合成-TTS文字转语音(专业版)

语音合成-TTS文字转语音(专业版) 一、工具简介 *使用强大的智能AI语音库&#xff0c;合成独具特色接近真人语音的朗读音频。 *使用极具表现力和类似人类的声音&#xff0c;使文本阅读器和已启用语音的助理等方案栩栩如生。 *用途&#xff1a;这个语音工具&#xff0c;不仅可…

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言函数 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀数组 &#x1f4d2;1. 什么是数组…

HTTP状态码(HTTP Status Code)讲解

HTTP状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由RFC 2616规范定义&#xff0c;并得到多个RFC规范的扩展。状态码告知客户端请求的处理结果及状态&#xff0c;有助于开发者定位和解决问题。 HTTP状态码分为…

HTTP请求与响应:Python爬虫技术解析

引言 在Web开发和数据抓取中&#xff0c;理解HTTP协议是至关重要的。HTTP&#xff08;超文本传输协议&#xff09;是用于从网络传输超文本到本地浏览器的标准协议。它定义了客户端与服务器之间请求和响应的格式。本文将从HTTP请求和响应的基本结构开始&#xff0c;逐步深入到如…

【C++】学习笔记——AVL树

文章目录 十六、AVL树1. AVL树的概念2. AVL树节点的定义3. AVL树的插入4. AVL树的旋转5. AVL树的验证6. 完整代码测试7. AVL树的性能 未完待续 十六、AVL树 1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&…

【机器学习】无监督学习和自监督学习

1. 什么是机器学习 机器学习是一种使计算机系统能够从数据中学习并做出预测或决策的技术和科学领域。它不需要显式地编程来执行特定任务&#xff0c;而是通过使用算法来分析数据和识别模式&#xff0c;以此“学习”如何做出准确的预测或决策。 以下是机器学习的几个关键点&…

【JS逆向课件:第七课:模块与包】

模块与包 模块 模块介绍 在计算机程序的开发过程中&#xff0c;随着程序代码越写越多&#xff0c;在一个文件里代码就会越来越长&#xff0c;越来越不容易维护。 为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件里&#xff0c;这样&…

前端基础之JavaScript学习——函数的使用

大家好我是来自CSDN的前端寄术区博主PleaSure乐事&#xff0c;今天我们继续有关JavaScript的学习&#xff0c;使用的编译器为vscode&#xff0c;浏览器为谷歌浏览器。 函数的声明与使用 声明 在JavaScript当中函数的声明和其他语言类似&#xff0c;使用如下格式即可声明&…

实战篇(十):使用Processing创建可爱花朵:实现随机位置、大小和颜色的花朵

使用Processing创建可爱花朵 0.效果预览1. 引言2. 设置Processing环境3. 创建花朵类4. 实现花瓣绘制5. 绘制可爱的笑脸6. 鼠标点击生成花朵7. 完整代码8. 总结与扩展0.效果预览 在本教程中,我们将使用Processing编程语言来创建一个可爱的花朵生成器。通过封装花朵为一个类,并…

大语言模型-检索测评指标

1. MRR &#xff08;Mean Reciprocal Rank&#xff09;平均倒数排名&#xff1a; 衡量检索结果排序质量的指标。 计算方式&#xff1a; 对于每个查询&#xff0c;计算被正确检索的文档的最高排名的倒数的平均值&#xff0c;再对所有查询的平均值取均值。 意义&#xff1a; 衡量…

Context使用

Context API 是 React 提供的一种用于跨组件层级共享数据的方法&#xff0c;它可以用来实现兄弟组件之间的通信。通常情况下&#xff0c;兄弟组件之间的通信需要通过它们的共同父组件来实现&#xff0c;而 Context API 则可以帮助我们避免将数据逐层传递到每一个中间组件。 实…