应用层协议 —— websocket

news/2024/12/1 20:28:06/

websocket介绍

websocket是从HTML5开始支持的一种网页端和服务端保持长连接消息推送机制。

传统的web程序都是属于“一问一答”的形式,即客户端给服务器发送了一个HTTP请求,服务器给客户端返回一个HTTP响应。这种情况下服务器属于被动的一方,如果客户端不主动发起请求,服务器就无法主动给客户端响应。

像网页即时聊天/游戏 这样的程序都是非常依赖“消息推送”的,即需要服务器主动推送消息到客户端。如果只是使用原生的HTTP协议,要想实现“消息推送”一般需要通过“轮询”(客户端定时向服务器发送请求来刷新)的方式实现,但轮询非常占用带宽(成本高)并且也不能及时获取到消息的响应(延迟高)

因此,就产生了WebSocket协议。

WebSocket更接近于TCP这种级别的通信方式,一旦建立连接,通信双方都可以向对方发送数据。

WebSocket原理

WebSocket协议本质上是一个基于TCP的协议

为了建立一个WebSocket连接,客户端首先要向服务器发起一个HTTP请求,一个请求和通常的HTTP请求不同,包含了一些附加头信息,通过这个附加头信息完成握手过程并升级协议的过程。

 报文格式

报文字段较多,重点关注这几个:

 FIN:WebSocket传输数据以消息为概念单位,一个消息有可能由一个或多个帧组成,FIN字段为1表示末尾帧

RSV1-3:保留字段,只在扩展时使用,若未启用扩展则置1,若收到不全为0的数据帧,且没有协商则立即终止连接。

mask:表示Payload数据是否被编码,若为1则必有Mask-Key,用于解码Payload数据,仅客户端发送给服务端的消息需要设置。

Mask-Key:当mask为1时存在,长度为4字节

解码规则:DECODED[i] = ENCODED[i] ^ MASK[i % 4]

Payload length:数据载荷的长度,单位是字节,有可能为7位、7+16未、7+64位。

假设Payload length = x  那么:

x = 0-126 :数据的长度为x字节

x = 126 :后续两个字节代表一个16位的无符号整数,该无符号整数的值为数据的长度

x = 127:后续8个字节代表一个64位的无符号整数(最高位为0), 该无符号整数的值为数据的长度

Payload data:报文携带的数据

WebSocketpp介绍

WebSocketpp是一个跨平台的开源(BSD许可证)头部专用C++库。它允许将WebSocket客户端和服务器功能集成到C++程序中。在最常见的配置中,全功能网络I/O由Asio网络库提供。

主要特性

事件驱动的接口

支持HTTP/HTTPS、WS/WSS、IPv6

灵活的以来管理 - Boost库/C++11标准库

可移植性:Posix/Windows、32/64bit、Intel/ARM

线程安全

Websocketpp同时支持HTTP和WebSocket两种网络协议

以下是一些相关的常用网站:

用户手册:http://docs.websocketpp.org/

github:https://github.com/zaphoyd/websocketpp

官网:http://www.zaphoyd.com/websocketpp


http://www.ppmy.cn/news/351437.html

相关文章

unity3D 使用BMFont制作清晰字体+位图字体(字符图片自定义需要的字体)

前言:在unity设计中,经常会遇到需要自定义字体的情况,毕竟unity自带的字体只有Arial一种,根本无法满足对字体样式的的需求,虽然unity也支持我们导入或者创建字体,并且可以在GUI Text、TextMesh中使用&#…

微软雅黑和consolas混合字体_未经授权使用“微软雅黑”,赔垮一家公司?方正辟谣了,但这事还是很危险...

使用电脑中常见的字体,不仅可能要付费,一不小心还会侵犯版权? 昨天,微博上传出了这样的爆料:某公司实习生用了微软雅黑字体,印刷了5000万张样稿,结果被起诉,公司赔了几千万,裁员数十人。 如此“惨状”一度引发网友热议。但昨日(3月5日)下午,认证为“北京北大方正电子…

Unity3d HoloLens的MRTK TextMeshProUGUI中文显示框框乱码需自制字体Font

Unity3d HoloLens的MRTK TextMeshProUGUI中文显示框框乱码需自制字体Font 中文乱码问题自制字体下载字体库创建Font Asset打开创建界面设置相关参数生成图集保存FontAsset 修改字体关联 解决后效果 中文乱码问题 随便打开一个MRTK的一个demo场景,都有的介绍面板都是…

linux在tty终端显示中文字符的最终解决办法(fbterm字体间距,简单实用)

linux在tty终端显示中文字符的最终解决办法(fbterm字体间距,简单实用) Linux 的tty文字终端默认是不支持中文的,这对我们使用文字终端办公造成一定困扰,而且还限制字体,只有几种并不好用的字体。这里我解决…

字蛛(FontSpider,中文字体压缩器)网页自由引入中文字体

之前看过设计师面试一位 Web 前端工程师,其中有一段这样的对话: “如果设计师希望用图片实现某个字体样式,而从技术的角度来说这样不合理,但设计师非常坚持,这时候你怎么办?” “我会给设计师讲解工程上面临…

icepdf转换pdf文件转图片高清且字体不乱码且盖章贴图可转

采用ICEpdf针对pdf转图片 目前,项目中有个需求,针对票据中pdf文字进行转换图片,进行前端展示。百度、谷歌一大堆ICEpdf 版本,几乎都是乱码,文字不识别而告终。在此笔记。当时脑子转不过弯,老是觉得最新版本…

万圣节字体来啦!6款风格奇幻的中文字体免费下载

一年一度的万圣节又要到啦!双手奉上[逐浪字库万圣节字体专题]1款新字体下载5款专题字体。早日完成设计,和大家一起“鬼”混! 打包下载:https://www.ziti163.com/Class_16/Default.aspx 逐浪金农书法体 逐浪金农书法体是一种基于…

html字体优化,优化阅读体验,网站预设字体的CSS最佳写法

优化阅读体验,网站预设字体的CSS最佳写法 7月 25, 2017 评论 Sponsor 英文字体的文件大小比较小可以使用嵌入字体让网站展示更好,但中文就不一样了,文件大小是 MB 级别,为了 WEB 端性能,只好使用系统自带的默认字体&am…