服务端文件:

  1. import base64
  2. import hashlib
  3. import socket
  4.  
  5. # 将请求头格式化成字典
  6. def get_headers(data):
  7. """
  8. 将请求头格式化成字典
  9. :param data:
  10. :return:
  11. """
  12. header_dict = {}
  13. data = str(data, encoding='utf-8')
  14.  
  15. # for i in data.split('\r\n'):
  16. # print(i)
  17. header, body = data.split('\r\n\r\n', 1)
  18. header_list = header.split('\r\n')
  19. for i in range(0, len(header_list)):
  20. if i == 0:
  21. if len(header_list[i].split(' ')) == 3:
  22. header_dict['method'], header_dict['url'], header_dict['protocol'] = header_list[i].split(' ')
  23. else:
  24. k, v = header_list[i].split(':', 1)
  25. header_dict[k] = v.strip()
  26. return header_dict
  27.  
  28. def run():
  29. sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  30.  
  31. sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  32.  
  33. sock.bind(("127.0.0.1",8002))
  34.  
  35. sock.listen(5)
  36.  
  37. conn,address = sock.accept()
  38.  
  39. data = conn.recv(1024)
  40.  
  41. ## data的数据:
  42. # print(data.decode("utf-8"))
  43. # E:\PythonPublic\Scripts\python.exe C:/Users/Administrator/Desktop/webSocket/demo/web.py
  44. # GET / HTTP/1.1
  45. # Host: 127.0.0.1:8002
  46. # Connection: Upgrade
  47. # Pragma: no-cache
  48. # Cache-Control: no-cache
  49. # User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36
  50. # Upgrade: websocket
  51. # Origin: http://localhost:63342
  52. # Sec-WebSocket-Version: 13
  53. # Accept-Encoding: gzip, deflate, br
  54. # Accept-Language: zh-CN,zh;q=0.9
  55. # Sec-WebSocket-Key: AeywaspR+reHpMX8RK2KBw==
  56. # Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
  57.  
  58. # 将请求头格式化成字典 {'method': 'GET', 'url': '/', 'protocol': 'HTTP/1.1', 'Host': '127.0.0.1:8002', 'Connection': 'Upgrade',。。。
  59. headers = get_headers(data)
  60.  
  61. # 标准加密字符串
  62. magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
  63.  
  64. # 对请求头中的Sec-WebSocket-Key进行加密
  65. value = headers['Sec-WebSocket-Key'] + magic_string # 拼接
  66. ac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest()) # hashlib + base64 加密
  67.  
  68. response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \
  69. "Upgrade:websocket\r\n" \
  70. "Connection: Upgrade\r\n" \
  71. "Sec-WebSocket-Accept: %s\r\n" \
  72. "WebSocket-Location: ws://%s%s\r\n\r\n"
  73.  
  74. # 定义返回数据 响应头格式
  75. response_str = response_tpl % (ac.decode('utf-8'), headers['Host'], headers['url'])
  76.  
  77. # 返回加密随机字符串返回
  78. conn.send(bytes(response_str, encoding='utf-8'))
  79.  
  80. # 循环接收
  81. while True:
  82. try:
  83. info = conn.recv(8096)
  84. except Exception as e:
  85. info = None
  86. if not info:
  87. break
  88.  
  89. # 获取到后7位 获取到126 127 《=125 都是不同的结果
  90. payload_len = info[1] & 127
  91. if payload_len == 126:
  92. extend_payload_len = info[2:4]
  93. mask = info[4:8]
  94. decoded = info[8:]
  95. elif payload_len == 127:
  96. extend_payload_len = info[2:10]
  97. mask = info[10:14]
  98. decoded = info[14:]
  99. else:
  100. extend_payload_len = None
  101. mask = info[2:6]
  102. decoded = info[6:]
  103.  
  104. bytes_list = bytearray()
  105. for i in range(len(decoded)):
  106. chunk = decoded[i] ^ mask[i % 4]
  107. bytes_list.append(chunk)
  108. body = str(bytes_list, encoding='utf-8')
  109. print("解密结果", body)
  110.  
  111. if __name__ == '__main__':
  112. run()

前端文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8.  
  9. </body>
  10. </html>
  11.  
  12. <script>
  13. // 自动创建随机字符串 将其发送给服务端 密文校验
  14. var ws = new WebSocket("ws://127.0.0.1:8002/")
  15. </script>

【webSocket】实现原理的更多相关文章

  1. WebSocket的原理,以及和Http的关系

    一.WebSocket是HTML5中的协议,支持持久连接:而Http协议不支持持久连接. 首先HTMl5指的是一系列新的API,或者说新规范,新技术.WebSocket是HTML5中新协议.新API. ...

  2. WebSocket的原理,以及和Http的关系 (转载)

    一.WebSocket是HTML5中的协议,支持持久连接:而Http协议不支持持久连接. 首先HTMl5指的是一系列新的API,或者说新规范,新技术.WebSocket是HTML5中新协议.新API. ...

  3. WebSocket协议-原理篇

    本篇文章主要讲述以下几点: WebSocket的原理与机制 WebSocket与Socket.io WebSocket兼容性 WebSocket的原理与机制 WebSocket协议分为两部分:握手和数 ...

  4. nginx支持websocket及websocket部分原理介绍

    nginx支持websocket及websocket部分原理介绍最近ipc通过websocket与server进行通行,经过无法通过nginx进行反向代理,只有直连nodejs端口.而且部署到阿里云用 ...

  5. Websocket(一)——原理及基本属性和方法

    初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起. 举例 ...

  6. WebSocket的原理与优缺点

    websocket 是长连接,受网络限制比较大,需要处理好重连,比如用户进电梯或电信用户打个电话网断了,这时候就需要重连,如果 ws 一直重连不上,有些较复杂的业务方会不愿意的,是不是还要搞个 htt ...

  7. (转)WebSocket的原理

    前言:无聊逛知乎,就逛到H5的栏目去了,正好看到了关于Websocket的东西.个人是比较喜欢看这类风格的,转到博客分享,以便自己以后理解. ---------------------分割线----- ...

  8. 分析HTML5中WebSocket的原理

    目录结构   一.什么是Websocket websocket是html5提出的一个协议规范,参考rfc6455. 不过目前还都是在草案,没有成为标准,毕竟html5还在路上. websocket约定 ...

  9. 一文带你看懂WebSocket 的原理?为什么可以实现持久连接?

    工作之余在知乎上偶然看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇让我对 websocket 的认知深刻易懂,之前看总完总觉得一知半解云里雾里.所以与大家共同分享一下一起学习.比较喜欢这种博客理 ...

  10. 【计算机网络】WebSocket实现原理分析

    1.介绍一下websocket和通信过程? 1.1 基本概念 [!NOTE] Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 T ...

随机推荐

  1. java性能分析之火焰图

    原由 最近因为kafka.zookeeper.ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优.性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了.不能一口吃成一 ...

  2. Celery---一个懂得异步任务,延时任务,周期任务的芹菜

    Celery是什么? celey是芹菜 celery是基于Python实现的模块,用于执行异步延时周期任务的 其结构组成是由 1.用户任务 app 2.管道任务broker用于存储任务 官方推荐red ...

  3. spring boot:配置shardingsphere(sharding jdbc)使用druid数据源(druid 1.1.23 / sharding-jdbc 4.1.1 / mybatis / spring boot 2.3.3)

    一,为什么要使用druid数据源? 1,druid的优点 Druid是阿里巴巴开发的号称为监控而生的数据库连接池 它的优点包括: 可以监控数据库访问性能 SQL执行日志 SQL防火墙 但spring ...

  4. spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)

    一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...

  5. linux(centos8):用tr替换或删除字符

    一,tr命令的用途 tr命令可以替换或删除文件中的字符 它从标准输入设备读取数据, 处理完成将结果输出到标准输出设备 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnbl ...

  6. centos8平台yum无法安装一些常用软件的解决,如:screen,iftop,nethogs

    一,例如:安装screen时报错: [root@localhost liuhongdi]# yum install screen 上次元数据过期检查:17:39:58 前,执行于 2020年03月18 ...

  7. java开发环境配置,看这一篇就足够了!

    可能平时大家对于安装环境的需求不是那么强烈,但是当你换了一台新电脑时,你就会发现怎么也得花费你几个小时乃至半天一天的时间.故此整理此篇文章,给有需要的小伙伴 注:本文皆win10环境 (1).JDK的 ...

  8. eclipse快捷键(Mac版)整理

    eclipse快捷键(Mac版)整理 前言: 最近在学习JDBC,老师用的是eclipse,对于习惯了IDEA的我来说,没有了快捷键,效率明显下降. 我认为,开发工具的熟练使用,也是程序员必备的一项技 ...

  9. Redis 入门与 ASP.NET Core 缓存

    目录 基础 Redis 库 连接 Redis 能用 redis 干啥 Redis 数据库存储 字符串 订阅发布 RedisValue ASP.NET Core 缓存与分布式缓存 内存中的缓存 ASP. ...

  10. LeetCode 45跳跃游戏&46全排列

    原创公众号:bigsai,回复进群加入力扣打卡群. 昨日打卡:LeetCode 42字符串相乘&43通配符匹配 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中 ...