WebSocket程序设计

协议说明

WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。Websocket主要用在B/S架构的应用程序中,在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

WebSocket 协议在2008年诞生,2011年成为国际标准。现在最新版本浏览器都已经支持了。

WebSocket 是一种应用层协议。

WebSocket 的典型特点:

  • 基于 TCP 协议的应用层协议,实现相对简单

  • 单个TCP连接上进行全双工通信

  • 兼容 HTTP 协议,默认端口也是80和443

  • 握手阶段采用 HTTP 协议,能通过各种 HTTP 代理服务器

  • 数据格式比较轻量,性能开销小,通信高效

  • 可以发送文本和二进制数据

  • 没有浏览器的同源限制

  • 协议标识符是 wswss,网址就是 URL,例如:ws://mashibing.com:80/some/path

websocket的典型场景:

  • 即时通信

  • 协同编辑/编辑

  • 实时数据流的拉取与推送

websocket推送和浏览器端轮询

在BS开发领域,若需要浏览器B即时得到服务器的状态更新,常使用两个方案:

  1. 浏览器端轮询

  2. 服务器端推送

浏览器轮询:浏览器端,当需要获取最新数据状态时,利用脚本程序循环向服务端发送请求。

服务器推送,服务器端,当状态改变时,将数据发送到浏览器端。

如图所示:

image.png

如果需要服务器端推送,则需要使用websocket协议。当然HTTP/2版本,也支持服务器端推送,但实现上以推送静态资源为主,不能基于业务逻辑推送特定的消息,因此当前的普及使用率websocket还是主流。

websocket 与 http 的对比

WebSocket通常和HTTP进行对比,如图:

image.png

WebSocket和HTTP 的相同点:

  • 应用层协议

  • B/S 架构中使用

  • 基于TCP协议

  • 端口默认都是:80和443

WebSocket和HTTP 的不同点:

WebSocketHTTP
通信模式双向单向
握手双方协商浏览器发起
服务器端推送支持不支持。H/2支持部分

WebSocket和HTTP 的联系:

websocket是在http基础上握手得到的。

WebSocket握手过程

通过HTTP请求响应,中的头信息,完成websocket握手,如图:

image.png

请求头如下:

 GET /chat HTTP/1.1Host: server.mashibing.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x4JJHMbDL22zLk1GBhXDw==Sec-WebSocket-Protocol: chatSec-WebSocket-Version: 13Origin: http://mashibing.com

其中:

 # 升级为 websocketUpgrade: websocketConnection: Upgrade# 一个 Base64 encode 的值,有于验证服务器端是否支持websocketSec-WebSocket-Key: x4JJHMbDL22zLk1GBhXDw==# 用户协议,可以视为不同业务逻辑的频道Sec-WebSocket-Protocol: chat# 协议版本,13是当前通用版本,几乎不需要更改Sec-WebSocket-Version: 13

基于以上请求头,服务器端,就知道需要将协议升级为websocket协议,并提供一些验证信息。

响应头如下:

 HTTP/1.1 101 Switching Protocols# 协议升级Upgrade: websocket# 连接状态Connection: Upgrade# WebSocket服务端根据Sec-WebSocket-Key生成Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=# WebSocket协议用户协议Sec-WebSocket-Protocol: chat

基于以上响应头,浏览器端就知道服务器端升级成功,并通过了验证。

至此,B/S端可以基于该连接,完成websocket双向通信了。

WebSocket的状态码

状态码名称描述
0–999-保留段, 未使用。
1000CLOSE_NORMAL正常关闭; 无论为何目的而创建, 该链接都已成功完成任务。
1001CLOSE_GOING_AWAY终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开。
1002CLOSE_PROTOCOL_ERROR由于协议错误而中断连接。
1003CLOSE_UNSUPPORTED由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收到了二进制数据)。
1004-保留。 其意义可能会在未来定义。
1005CLOSE_NO_STATUS保留。 表示没有收到预期的状态码。
1006CLOSE_ABNORMAL保留。 用于期望收到状态码时连接非正常关闭 (也就是说, 没有发送关闭帧)。
1007Unsupported Data由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据)。
1008Policy Violation由于收到不符合约定的数据而断开连接。 这是一个通用状态码, 用于不适合使用 1003 和 1009 状态码的场景。
1009CLOSE_TOO_LARGE由于收到过大的数据帧而断开连接。
1010Missing Extension客户端期望服务器商定一个或多个拓展, 但服务器没有处理, 因此客户端断开连接。
1011Internal Error客户端由于遇到没有预料的情况阻止其完成请求, 因此服务端断开连接。
1012Service Restart服务器由于重启而断开连接。 [Ref]
1013Try Again Later服务器由于临时原因断开连接, 如服务器过载因此断开一部分客户端连接。 [Ref]
1014-由 WebSocket
1015TLS Handshake保留。 表示连接由于无法完成 TLS 握手而关闭 (例如无法验证服务器证书)。
1016–1999-由 WebSocket 标准保留以便未来使用。
2000–2999-由 WebSocket 拓展保留使用。
3000–3999-可以由库或框架使用。 不应由应用使用。 可以在 IANA 注册, 先到先得。
4000–4999-可以由应用使用。

服务端编码

需要:

  • HTTP服务器,net/http 或者 gin(或其他HTTP框架)

  • 处理WebSocket协议的包,GitHub - gorilla/websocket: Package gorilla/websocket is a fast, well-tested and widely used WebSocket implementation for Go.

其中:GitHub - gorilla/websocket: Package gorilla/websocket is a fast, well-tested and widely used WebSocket implementation for Go. 是github上Go语言Star数最高的websocket包,推荐使用。

安装gorilla/websocket:

 go get github.com/gorilla/websocket

实现流程:

  1. 创建HTTP服务器

  2. 提供特定路由处理websocket协议

  3. 升级为ws协议

  4. 处理Websocket消息

    1. 发送消息

    2. 接收消息

编码实现:

 ​

测试:

 ​

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

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

相关文章

2024全面解析:从零基础到精通的大模型学习路线,非常详细零基础入门到精通,收藏我这一篇就够了

大模型学习路线规划 第一阶段:基础理论入门 目标:了解大模型的基本概念和背景。 内容: 人工智能演进与大模型兴起。 大模型定义及通用人工智能定义。 GPT模型的发展历程。 第二阶段:核心技术解析 目标:深入学习大模…

python 图片转文字、语音转文字、文字转语音保存音频并朗读

一、python图片转文字 1、引言 pytesseract是基于Python的OCR工具, 底层使用的是Google的Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png, gif, bmp, tiff等图片格式 2、环境配置 python3.6PIL库安装Google Tesseract OCR 3、安…

mac下通过brew安装mysql的环境调试

mac安装mysql 打开终端,运行命令(必须已经装过homebrew哦): 安装brewbin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"已安装brew直接运行:brew install mysql8.0报…

洛科威岩棉板在生产生活中广泛应用,以优秀表现实现隔热性能最大化

无论是在住宅领域还是工业生产领域,隔热保温都扮演着极其重要的角色,选用的材料是否足够出色,决定了大家居家生活的舒适度,以及生产过程中能耗的高低。近些年来,洛科威岩棉优秀的隔热性能逐渐得到了各行各业的青睐&…

HomeDepot commercedesk 平台EDI自测流程

Home Depot Canada 是一家全球知名的家居建材零售公司,在加拿大拥有多家分店。它是美国的家居建材零售巨头 Home Depot 在加拿大的子公司。Home Depot 主要销售各种家庭装修和建筑材料,包括工具、家具、装饰品、电器等。公司提供广泛的产品选择和专业的顾…

机器学习(二十四):信息增益、独热编码和回归树

一、纯度测量方式——熵 第一步,定义:一个子集里,某一类别的数据在子集中的占比 例如,下图这组输入数据,根据耳朵形状划分为两个子集,尖耳朵子集里,有四只猫,1只狗。则是4/5 第二步…

NVIDIA正偷偷复活卡皇泰坦,性能秒杀5090Ti

PC 硬件圈的瓜年年有,但最近似乎格外的多噢! 首先针对 13、14 代酷睿 CPU 不稳定问题,Intel 终于做出了正式回应: 他们在对退回的 CPU 进行大量分析后得出,确认是过高的运行电压和微代码算法错误导致了不稳定情况。 …

2-48 基于matlab的EM算法聚类可视化程序

基于matlab的EM算法聚类可视化程序,通过期望最大化算法(EM)优化类别间距,使得类别间距最大、类内间距最小。输出聚类前后结果及收敛曲线。程序已调通,可直接运行。 2-48 期望最大化算法(EM) 聚类…

微信小程序教程002:代码结构介绍和新建小程序页面

文章目录 代码介绍1、小程序代码构成2、小程序页面组成部分3、JSON配置文件的作用3.1 app.json文件3.2 project.config.json文件3.3 sitemap.json文件3.4 页面的.json文件 新建小程序页面WXML和WXSS介绍1、什么是WXML2、什么是WXSS 小程序的JS文件1、JS文件2、小程序中JS文件分…

使用abpcli创建项目时提示数据库迁移失败

问题描述 使用abpcli创建项目时提示数据库迁移失败! 解决方案: 1、检查数据库连接字符串 {"ConnectionStrings": {"Default": "serverlocalhost;port3306;databaseAcmeBookStore;userroot;passwordyour_password;"} }2、…

MySQL数据库的DQL的高级数据查询语句

目录 非等值联查: 等值联查: eg:5张表联查 连接查询——left/right/inner join on eg: 连接查询——union Eg: 不去重的并集——union all 子查询(内部查询) 1、where型子查询 2、from型子查询&a…

微信小程序之用户登录

用户登录是小程序的一个常用功能,当用户在浏览文章想要收藏时,在线上购买商品时,只有用户登录自己账号以后,才可以进一步使用这些功能。此文论述了小程序用户登录功能的设计流程 一、设计思路 1、界面 小程序界面效果如下所示&…

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下,只有出现RunTimeException才会回滚事务,rollbackfor属性用于控制出现何种异常类型,回滚…

Linux shell编程笔记0

一、shell概述 shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。 shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。 二、shell脚本入门 1.进入编辑模式进入到目录下 vi 文件名称如果是system下的文件…

电子水尺的工作原理

TH-SC24电子水尺,也被称为感应式防汛水尺或水位在线监测仪,是一种专门用于监测河流水域水位变化的高科技设备。它在防汛工作中发挥着至关重要的作用,能够实时、准确地提供水位数据,为防汛决策和应急响应提供有力支持。   工作原…

连续两年入选!得帆信息强势上榜2024 Gartner ICT技术成熟度曲线

近日,国际权威咨询机构Gartner发布了《Hype Cycle for ICT in China, 2024》(2024年中国ICT技术成熟度曲线)报告。得帆信息连续两年入选低代码应用平台(LCAP)标杆供应商(Sample Vendor)。 每年&…

ABAP 无意义的FORM 规范

发现一个极为奇怪的现象,大多数ABAP程序员会在FORM名称前加前缀frm_。 请问这是规范吗,整齐好看吗,又好看在哪里呢。这是哪个师傅教的,意义是什么?而且大多数人就来个frm_get_data与frm_del_data,然后这两…

基于springboot+vue+uniapp的居民健康监测小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

(CVPR-2024)通过多阶段框架和定制的多解码器架构提高扩散模型的训练效率

通过多阶段框架和定制的多解码器架构提高扩散模型的训练效率 Paper Title:Improving Training Efficiency of Diffusion Models via Multi-Stage Framework and Tailored Multi-Decoder Architecture Paper是密歇根大学发表在CVPR 2024的工作 Paper地址 Code地址 Abstract 扩散…

通过哨兵1号SAR数据获取桂林619洪水内涝情况

目录 1.SAR数据下载 2.SAR数据处理 1、下载轨道数据并进行轨道校正。 2、数据处理 3、转换SAR单位并创建彩色合成影像 3.查看彩色合成SAR数据 4.水体提取方法探讨 方法1:阈值提取法 方法2:深度学习提取水域 5.SAR与DEM数据获取 2024年6月19日&a…