• 实现及原理

Websocket是一种在单个TCP连接上进行全双工通讯的协议。 WebSocket 首先发起一个 HTTP 请求,在请求头加上 `Upgrade` 字段,该字段用于改变 HTTP 协议版本或者是换用其他协议,这里我们把 `Upgrade` 的值设为 `websocket` ,将它升级为 WebSocket 协议

  • 如何建立通信

握手过程: websocket-client端通过ws协议向websocket-server端发起连接请求前,首先在自己的请求头中添加Sec-Websocket-Key键值对,值为根据自己账号通过一定的方式生成的字符串,client端发送自己的key后,server端取出并保存该字符串后,将该字符串与魔法字符串拼接后先后经过sha1、base64加密后获得与此client端的通信密钥保存并发送给client端,client端在本地保存此通信密钥,此时server端与client端完成握手。

通信过程(解密): server端或client端在收到加密信息(字节类型)后,将加密信息的第二个字节与127进行与位运算,根据位运算的结果分为=127、=126、<=125三种情况,根据不同的位运算结果分别取出其掩码(mask)部分和数据部分,将掩码部分与数据进行^(异或)运算即得到真实的数据(字节类型),根据编码类型进行解码后即得到可读性的数据。

通信过程(加密):

import struct
msg_bytes = "hello".encode("utf8")
token = b"\x81"
length = len(msg_bytes)
if length < 126:
token += struct.pack("B", length)
elif length == 126:
token += struct.pack("!BH", 126, length)
else:
token += struct.pack("!BQ", 127, length)
msg = token + msg_bytes
print(msg)

最新文章

  1. 理解 OpenStack 高可用(HA)(1):OpenStack 高可用和灾备方案 [OpenStack HA and DR]
  2. Python之路----------random模块
  3. 我的PhoneGap安装配置经历
  4. css布局之两列布局
  5. logging日志模块
  6. 基本hibernate DEMO
  7. Linux内核学习笔记: uid之ruid,euid,suid
  8. Hive 1、什么是Hive,Hive有什么用
  9. 使用disqus搭建comment时一件非常二的事
  10. 网页被Chrome识别成英语,区域,语言,网站
  11. python定制类(以Fib类为例)
  12. jquery ajax请求成功,数据返回成功,seccess不执行的问题
  13. 强推一款开源集成开发环境——Geany
  14. 基于Windows下浏览器无法正常打开的解决方案
  15. Java8之Lambda表达式基础
  16. hive:某张表进行分页
  17. table中的一些另类标签
  18. Unity 协同程序
  19. python自动化开发-[第十四天]-javascript(续)
  20. Servlet(8)—GenericServlet和改进Servlet实例

热门文章

  1. Linq(一)
  2. numpy delete
  3. 3D打印GCODE文件学习(一)
  4. golang 缺少逗号报错问题
  5. Vertical-align + 表单
  6. python笔记13-文件读写
  7. 前端修炼の道 | &lt;div&gt; 标签简介
  8. C++内存管理-new,delete,new[],placement new的简单使用
  9. Oracle之 dmp导入/导出、数据库操作等过程中的字符集问题
  10. 清楚理解const_cast类型转换