我只是程序员的搬运工=.=....借助一个比较随意的图来解释一下:

流程:

1. Client try to connect to WebSocket server
2. Server recognize client
3. If client is not registered with server then add client (this is known as handshaking process which is based on headers transmission)
4. Send and receive data
5. Close connection

如果只需要了解WebSocket,上面的图应该就足够了,它包含一下内容:

  1. WebSocket的协议须通过HTTP请求建立(请求方式必须为GET,具体的握手协议属于高级内容).
  2. WebSocket的消息体被前缀(0x00)和后缀(0xff)包裹起来.
  3. 当消息体为空的时候=告诉服务器可以断开连接了.(这一条是我瞎猜的,没试过.先占个位置,有空尝试了修正.)

接下来稍微深入一点点,以下内容纯属瞎掰,才学编程半年多,写错了敬请指正!

握手协议:

  客户端请求建立握手协议:

GET / HTTP/1.1                                      //请求格式为GET,url为"/",http协议版本必须在1.1及以上
Upgrade: websocket                                  //Upgrade头域内容:websocket;告诉服务器需要升级到什么协议
Connection: Upgrade                                 //Connection头域内容:Upgrade;控制可选操作为Upgrade
Host: example.com                       //服务器主机地址
Origin: null                         //来源地址
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==      //连接加密字符串
Sec-WebSocket-Version: 13                 //WebSocket协议版本

  服务器返回结果:
HTTP/1.1 101 Switching Protocols              //状态码101,服务器理解了客户端升级协议的请求
Upgrade: websocket                     //协议将升级到WebSocket
Connection: Upgrade                    //控制可选操作为Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=  //根据客户端发送的key生成的加密值
Sec-WebSocket-Origin: null                //来源地址
Sec-WebSocket-Location: ws://example.com/        //WebSocket通信的地址

接下来是消息格式:感谢http://www.cnblogs.com/smark/archive/2012/11/26/2789812.html....

数据交互协议:

这图有点难看懂...里面包括几种情况有掩码,数据长度小于126,小于UINT16和小于UINT64等几种情况.后面会慢慢详细说明.

整个协议头大概分三部分组成:

  1. 描述消息结束情况和类型.
  2. 描述是否存在掩码长度.
  3. 扩展长度描述和掩码值.

从图中可以看到WebSocket协议数据主要通过头两个字节来描述数据包的情况

第一个字节

最高位用于描述消息是否结束,如果为1则该消息为消息尾部,如果为零则还有后续数据包;后面3位是用于扩展定义的,如果没有扩展约定的情况则必须为0.可以通过以下c#代码方式得到相应值

1 mDataPackage.IsEof = (data[start] >> 7) > 0;

最低4位用于描述消息类型,消息类型暂定有15种,其中有几种是预留设置.c#代码可以这样得到消息类型:

1 int type = data[start] & 0xF;
2 mDataPackage.Type = (PackageType)type;

第二个字节

消息的第二个字节主要用一描述掩码和消息长度,最高位用0或1来描述是否有掩码处理,可以通过以下c#代码方式得到相应值

1 bool hasMask = (data[start] >>7) > 0;

剩下的后面7位用来描述消息长度,由于7位最多只能描述127所以这个值会代表三种情况,一种是消息内容少于126存储消息长度,如果消息长度少于UINT16的情况此值为126,当消息长度大于UINT16的情况下此值为127;这两种情况的消息长度存储到紧随后面的byte[],分别是UINT16(2位byte)和UINT64(4位byte).可以通过以下c#代码方式得到相应值

 1 mPackageLength = (uint)(data[start] & 0x7F);
 2 start++;
 3 if (mPackageLength == 126)
 4 {
 5     mPackageLength = BitConverter.ToUInt16(data, start);
 6     start = start + 2;
 7 }
 8 else if (mPackageLength == 127)
 9 {
10     mPackageLength = BitConverter.ToUInt64(data, start);
11     start = start + 8;
12 }

如果存在掩码的情况下获取4位掩码值:

1 if (hasMask)
2 {
3     mDataPackage.Masking_key = new byte[4];
4     Buffer.BlockCopy(data, start, mDataPackage.Masking_key, 0, 4);
5
6     start = start + 4;
7     count = count - 4;
8 }

获取消息体

当得到消息体长度后就可以获取对应长度的byte[],有些消息类型是没有长度的如%x8 denotes a connection close.对于Text类型的消息对应的byte[]是相应字符的UTF8编码.获取消息体还有一个需要注意的地方就是掩码,如果存在掩码的情况下接收的byte[]要做如下转换处理:

1 if (mDataPackage.Masking_key != null)
2 {
3     int length = mDataPackage.Data.Count;
4     for (var i = 0; i < length; i++)
5         mDataPackage.Data.Array[i] = (byte)mDataPackage.Data.Array[i]^mDataPackage.Masking_key[i % 4]);
6 }

以上,以后再补充,我消化不过来了....

 

转载于:https://www.cnblogs.com/snys98/p/4437162.html

WebSocket简介相关推荐

  1. websocket简介及上手,node + vue实现websocket服务

    websocket简介及上手 1.websocket初识: WebSocket 是 HTML5 提供的一种全双工通讯的协议,类似于http,同样建立在TCP上的传输协议,被称为ws,加密传输称为wss ...

  2. websocket 简介

    一   WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome, ...

  3. websocket之一:websocket简介

    Websocket websocket为一次HTTP握手后,后续通讯为tcp协议的通讯方式. WebSocket 使用一种被称作"Upgrade handshake(升级握手)"的 ...

  4. WebSocket入门教程(一)-- WebSocket简介

    [WebSocket是什么] WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).一开始的握手需要借助HTTP请求完成.WebS ...

  5. 3w字带你揭开WebSocket的神秘面纱~

    目录 一. WebSocket 简介 WebSocket 是一种基于 TCP 的网络协议.在 2009 年诞生,于 2011 年被 IETF 定为标准 RFC 6455 通信标准,并由 RFC7936 ...

  6. Spring消息之WebSocket

    一.WebSocket简介 WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议.在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Sock ...

  7. 实现一个简单的WebSocket聊天室

    WebSocket 简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主 ...

  8. 网页实时聊天之PHP如何实现websocket

    网页实时聊天之PHP如何实现websocket 一.总结 一句话总结: 应用 PHP 的 socket 函数库:PHP 的 socket 函数库跟 C 语言的 socket 函数非常类似 PHP 实现 ...

  9. node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试

    WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询 (Polling)和Comet技术,Come ...

  10. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. 作 ...

最新文章

  1. Elasticsearch介绍Kibana分词器增删改操作
  2. Django2.2-LookupError No installed app with label admin
  3. 网站服务器windows登陆密码忘记,网站服务器windows登陆密码忘记
  4. 这几个概念你可能还是没搞清require、import和export
  5. Tomcat详解(一)——tomcat基础知识
  6. python3语法学习第四天--字符串
  7. python编译 pyd 工具_python如何编译py文件生成pyc、pyo、pyd以及如何和C语言结合使用...
  8. vs2015无法编辑html,连发Lianfa娱乐app -连发Lianfa娱乐appV6.2.84
  9. 小程序发布上线流程_微信小程序发布_审核上线流程及注意事项_企业服务汇
  10. 【STM32Cube笔记】16-STM32Cube个性化定制
  11. PPT文档如何插入超链接
  12. 论文笔记: FSA-Net
  13. USRP_X310_Device_Recovery手册
  14. 【游戏感想】古剑奇谭2
  15. 移动通信网络规划:机房设计
  16. 6月15号MOVE PROTOCOL上线测试版,如何参与呢?
  17. 堡垒机-百百堡垒机-基于WEB的VNC、RDP、SSH远程控制。无须任何插件,随时随地远程。
  18. CA认证简单介绍和工作流程
  19. android 短信迁移到iphone,将安卓手机上的短信导入到iphone上的方法
  20. 班子不到位,一切都白费

热门文章

  1. 使用超链接实现企业QQ在线客服
  2. 深度 | 为什么通用AMM模型不适用于期权交易定价?
  3. 用Python制作fits文件
  4. 镁光闪存颗粒对照表_海力士、南亚、镁光内存颗粒编码解析,妈妈再也不用担心你买内存条了...
  5. 自动以管理员身份运行bat脚本
  6. 目标检测标签分配之 OTA 和 SimOTA 细节学习
  7. 明源云客微信抢房技巧_抢房明源系统是什么意思_明源云客抢房软件
  8. 学习笔记(1):Matlab小白入门必备教程-数据的基本运算
  9. 开源homekit adk 测试
  10. 年轻人逃离算法?更懂你的时尚推荐算法,你会拒绝吗?| FashionHack 专栏