【webSocket】实现原理
服务端文件:
- import base64
- import hashlib
- import socket
- # 将请求头格式化成字典
- def get_headers(data):
- """
- 将请求头格式化成字典
- :param data:
- :return:
- """
- header_dict = {}
- data = str(data, encoding='utf-8')
- # for i in data.split('\r\n'):
- # print(i)
- header, body = data.split('\r\n\r\n', 1)
- header_list = header.split('\r\n')
- for i in range(0, len(header_list)):
- if i == 0:
- if len(header_list[i].split(' ')) == 3:
- header_dict['method'], header_dict['url'], header_dict['protocol'] = header_list[i].split(' ')
- else:
- k, v = header_list[i].split(':', 1)
- header_dict[k] = v.strip()
- return header_dict
- def run():
- sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
- sock.bind(("127.0.0.1",8002))
- sock.listen(5)
- conn,address = sock.accept()
- data = conn.recv(1024)
- ## data的数据:
- # print(data.decode("utf-8"))
- # E:\PythonPublic\Scripts\python.exe C:/Users/Administrator/Desktop/webSocket/demo/web.py
- # GET / HTTP/1.1
- # Host: 127.0.0.1:8002
- # Connection: Upgrade
- # Pragma: no-cache
- # Cache-Control: no-cache
- # 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
- # Upgrade: websocket
- # Origin: http://localhost:63342
- # Sec-WebSocket-Version: 13
- # Accept-Encoding: gzip, deflate, br
- # Accept-Language: zh-CN,zh;q=0.9
- # Sec-WebSocket-Key: AeywaspR+reHpMX8RK2KBw==
- # Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
- # 将请求头格式化成字典 {'method': 'GET', 'url': '/', 'protocol': 'HTTP/1.1', 'Host': '127.0.0.1:8002', 'Connection': 'Upgrade',。。。
- headers = get_headers(data)
- # 标准加密字符串
- magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
- # 对请求头中的Sec-WebSocket-Key进行加密
- value = headers['Sec-WebSocket-Key'] + magic_string # 拼接
- ac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest()) # hashlib + base64 加密
- response_tpl = "HTTP/1.1 101 Switching Protocols\r\n" \
- "Upgrade:websocket\r\n" \
- "Connection: Upgrade\r\n" \
- "Sec-WebSocket-Accept: %s\r\n" \
- "WebSocket-Location: ws://%s%s\r\n\r\n"
- # 定义返回数据 响应头格式
- response_str = response_tpl % (ac.decode('utf-8'), headers['Host'], headers['url'])
- # 返回加密随机字符串返回
- conn.send(bytes(response_str, encoding='utf-8'))
- # 循环接收
- while True:
- try:
- info = conn.recv(8096)
- except Exception as e:
- info = None
- if not info:
- break
- # 获取到后7位 获取到126 127 《=125 都是不同的结果
- payload_len = info[1] & 127
- if payload_len == 126:
- extend_payload_len = info[2:4]
- mask = info[4:8]
- decoded = info[8:]
- elif payload_len == 127:
- extend_payload_len = info[2:10]
- mask = info[10:14]
- decoded = info[14:]
- else:
- extend_payload_len = None
- mask = info[2:6]
- decoded = info[6:]
- bytes_list = bytearray()
- for i in range(len(decoded)):
- chunk = decoded[i] ^ mask[i % 4]
- bytes_list.append(chunk)
- body = str(bytes_list, encoding='utf-8')
- print("解密结果", body)
- if __name__ == '__main__':
- run()
前端文件:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- </body>
- </html>
- <script>
- // 自动创建随机字符串 将其发送给服务端 密文校验
- var ws = new WebSocket("ws://127.0.0.1:8002/")
- </script>
【webSocket】实现原理的更多相关文章
- WebSocket的原理,以及和Http的关系
一.WebSocket是HTML5中的协议,支持持久连接:而Http协议不支持持久连接. 首先HTMl5指的是一系列新的API,或者说新规范,新技术.WebSocket是HTML5中新协议.新API. ...
- WebSocket的原理,以及和Http的关系 (转载)
一.WebSocket是HTML5中的协议,支持持久连接:而Http协议不支持持久连接. 首先HTMl5指的是一系列新的API,或者说新规范,新技术.WebSocket是HTML5中新协议.新API. ...
- WebSocket协议-原理篇
本篇文章主要讲述以下几点: WebSocket的原理与机制 WebSocket与Socket.io WebSocket兼容性 WebSocket的原理与机制 WebSocket协议分为两部分:握手和数 ...
- nginx支持websocket及websocket部分原理介绍
nginx支持websocket及websocket部分原理介绍最近ipc通过websocket与server进行通行,经过无法通过nginx进行反向代理,只有直连nodejs端口.而且部署到阿里云用 ...
- Websocket(一)——原理及基本属性和方法
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起. 举例 ...
- WebSocket的原理与优缺点
websocket 是长连接,受网络限制比较大,需要处理好重连,比如用户进电梯或电信用户打个电话网断了,这时候就需要重连,如果 ws 一直重连不上,有些较复杂的业务方会不愿意的,是不是还要搞个 htt ...
- (转)WebSocket的原理
前言:无聊逛知乎,就逛到H5的栏目去了,正好看到了关于Websocket的东西.个人是比较喜欢看这类风格的,转到博客分享,以便自己以后理解. ---------------------分割线----- ...
- 分析HTML5中WebSocket的原理
目录结构 一.什么是Websocket websocket是html5提出的一个协议规范,参考rfc6455. 不过目前还都是在草案,没有成为标准,毕竟html5还在路上. websocket约定 ...
- 一文带你看懂WebSocket 的原理?为什么可以实现持久连接?
工作之余在知乎上偶然看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇让我对 websocket 的认知深刻易懂,之前看总完总觉得一知半解云里雾里.所以与大家共同分享一下一起学习.比较喜欢这种博客理 ...
- 【计算机网络】WebSocket实现原理分析
1.介绍一下websocket和通信过程? 1.1 基本概念 [!NOTE] Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 T ...
随机推荐
- java性能分析之火焰图
原由 最近因为kafka.zookeeper.ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优.性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了.不能一口吃成一 ...
- Celery---一个懂得异步任务,延时任务,周期任务的芹菜
Celery是什么? celey是芹菜 celery是基于Python实现的模块,用于执行异步延时周期任务的 其结构组成是由 1.用户任务 app 2.管道任务broker用于存储任务 官方推荐red ...
- 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 ...
- spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)
一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...
- linux(centos8):用tr替换或删除字符
一,tr命令的用途 tr命令可以替换或删除文件中的字符 它从标准输入设备读取数据, 处理完成将结果输出到标准输出设备 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnbl ...
- centos8平台yum无法安装一些常用软件的解决,如:screen,iftop,nethogs
一,例如:安装screen时报错: [root@localhost liuhongdi]# yum install screen 上次元数据过期检查:17:39:58 前,执行于 2020年03月18 ...
- java开发环境配置,看这一篇就足够了!
可能平时大家对于安装环境的需求不是那么强烈,但是当你换了一台新电脑时,你就会发现怎么也得花费你几个小时乃至半天一天的时间.故此整理此篇文章,给有需要的小伙伴 注:本文皆win10环境 (1).JDK的 ...
- eclipse快捷键(Mac版)整理
eclipse快捷键(Mac版)整理 前言: 最近在学习JDBC,老师用的是eclipse,对于习惯了IDEA的我来说,没有了快捷键,效率明显下降. 我认为,开发工具的熟练使用,也是程序员必备的一项技 ...
- Redis 入门与 ASP.NET Core 缓存
目录 基础 Redis 库 连接 Redis 能用 redis 干啥 Redis 数据库存储 字符串 订阅发布 RedisValue ASP.NET Core 缓存与分布式缓存 内存中的缓存 ASP. ...
- LeetCode 45跳跃游戏&46全排列
原创公众号:bigsai,回复进群加入力扣打卡群. 昨日打卡:LeetCode 42字符串相乘&43通配符匹配 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中 ...