python websocket服务器端_python实现websocket服务器
websocket是什么呢,websocket是一个和服务器通信的新的协议,一般而言,浏览器和服务器通信最常用的是http协议,但是http协议是无状态的,每次浏览器请求信息,服务器返回信息后这个浏览器和服务器通信的信道就被关闭了,这样使得服务器如果想主动给浏览器发送信息变得不可能了,服务器推技术在http时代的解决方案一个是客户端去轮询,或是使用comet技术,而websocket则和一般的socket一样,使得浏览器和服务器建立了一个双工的通道。
具体的websocket协议在rfc6455里面有,这里简要说明一下。websocket通信需要先有个握手的过程,使得协议由http转变为webscoket协议,然后浏览器和服务器就可以利用这个socket来通信了。
首先浏览器发送握手信息,要求协议转变为websocket
get / http/1.1
host: example.com
upgrade: websocket
connection: upgrade
sec-websocket-key: dghlihnhbxbszsbub25jzq==
origin:
服务器接收到信息后,取得其中的sec-websocket-key,将他和一个固定的字符串258eafa5-e914-47da-95ca-c5ab0dc85b11做拼接,得到的字符串先用sha1做一下转换,再用base64转换一下,就得到了回应的字符串,这样服务器端发送回的消息是这样的
http/1.1 101 switching protocols
upgrade: websocket
connection: upgrade
sec-websocket-accept: s3pplmbitxaq9kygzzhzrbk+xoo=
这样握手就完成了,用python来实现这段握手过程的话就是下面这样。
defhandshake(conn):
key =none
data = conn.recv(8192)
ifnotlen(data):
returnfalse
forlineindata.split('\r\n\r\n')[0].split('\r\n')[1:]:
k, v = line.split(': ')
ifk =='sec-websocket-key':
key =base64.b64encode(hashlib.sha1(v +'258eafa5-e914-47da-95ca-c5ab0dc85b11').digest())
ifnotkey:
conn.close()
returnfalse
response ='http/1.1 101 switching protocols\r\n'\
'upgrade: websocket\r\n'\
'connection: upgrade\r\n'\
'sec-websocket-accept:'+ key +'\r\n\r\n'
conn.send(response)
returntrue
握手过程完成之后就是信息传输了,websocket的数据信息格式是这样的。
+-+-+-+-+-------+-+-------------+-------------------------------+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|f|r|r|r| opcode|m| payload len | extended payload length |
|i|s|s|s| (4) |a| (7) | (16/64) |
|n|v|v|v| |s| | (if payload len==126/127) |
| |1|2|3| |k| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| | masking-key, if mask set to 1 |
+-------------------------------+-------------------------------+
| masking-key (continued) | payload data |
+-------------------------------- - - - - - - - - - - - - - - - +
: payload data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| payload data continued ... |
+---------------------------------------------------------------+
值得注意的是payload len这项,表示数据的长度有多少,如果小于126,那么payload len就是数据的长度,如果是126那么接下来2个字节是数据长度,如果是127表示接下来8个字节是数据长度,然后后面会有四个字节的mask,真实数据要由payload data和mask做异或才能得到,这样就可以得到数据了。发送数据的格式和接受的数据类似,具体细节可以去参考rfc6455,这里就不过多赘述了。
然后在我的github上有我实现的websocket server的代码,简单使用的话是足够了,但是如果是作为应用还是需要把所有的协议的具体细节都去实现才可以。
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
python websocket服务器端_python实现websocket服务器相关推荐
- python websocket例程_python 实现websocket
#!/usr/bin python#-*- coding:UTF-8 -*- importredisimporttime, threading, sched, json, socket, base64 ...
- python云资源管理_python管理云服务器
如今是云时代,公司买服务器也从传统的IDC托管到现在的各大云厂商采购 .这里,我们将以阿里云.腾讯云为例实现云服务器实例的获取. 1.首先部署django环境,然后安装django drf, 把drf ...
- python探测端口_python检测远程服务器tcp端口的方法
本文实例讲述了python检测远程服务器tcp端口的方法.分享给大家供大家参考.具体如下: python检测远程服务器tcp端口的代码,这段代码可以用来做服务器监控实用 #!/usr/bin/env ...
- python数据库连接信息加密_python实现对服务器脚本敏感信息的加密解密功能
背景 在实际项目实施中,会编写很多在服务器执行的作业脚本.程序中凡是涉及到数据库链接.操作系统用户链接.IP地址.主机名称的内容都是敏感信息.在纯内网系统中往因为开发时间紧迫,往往都直接将这些敏感信息 ...
- python sftp连接_python 进行ftp服务器和sftp服务器连接
1.背景. 最近接到一个任务,需要写一个python脚本,从客户公司的服务器拉取图片存放到我们公司的sftp服务器. 由于没头没脑,所以我采用无限遍历,将对方服务器中文件的路径原原本本的复制到我们公司 ...
- python爬虫代理服务器_Python爬虫之服务器:代理IP万能
最近很多同学租服务器用来学习爬虫,对于大部分小白来说,爬虫非常复杂.技术门槛很高.但我们可以通过爬虫获取大量的价值数据,经分析可以发挥巨大的价值,比如:豆瓣.知乎,爬取优质答案,筛选出各话题下热门内容 ...
- python websocket模块_python websocket学习使用
前言 今天看了一些资料,记录一下心得. websocket是html5引入的一个新特性,传统的web应用是通过http协议来提供支持,如果要实时同步传输数据,需要轮询,效率低下 websocket是类 ...
- python web 服务器实时监控 websocket_python websocket网页实时显示远程服务器日志信息...
功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...
- python websocket爬虫_Python如何爬取实时变化的WebSocket数据
一.前言 作为一名爬虫工程师,在工作中常常会遇到爬取实时数据的需求,比如体育赛事实时数据.股市实时数据或币圈实时变化的数据.如下图: Web 领域中,用于实现数据'实时'更新的手段有轮询和 WebSo ...
- python websocet回调_python – 线程,非阻塞websocket客户端
他们的 github page中有一个例子可以做到这一点.看起来你从那个例子开始并从on_open中每秒发送一次消息并在run_forever调用之后粘贴它,BTW一直运行直到套接字断开. 也许你在这 ...
最新文章
- Redis的一些“锁”事
- 登陆窗体显示动态效果
- Eclipse-Java代码规范和质量检查插件-SonarLint
- python requirements.txt_python生成requirements.txt的两种方法
- 关于MYSQL日期 字符串 时间戳互转
- 美国物流管理协会更名标志全球物流进入供应链时代
- 以太币(Ether)的单位
- Hyper-V下虚拟机无法启动的故障排除
- JZOJ 2308. 【中山市选2011】聚会
- 检查vCenter Server上STS证书的过期日期(79248)(STS证书过期,导致 vCenter 报503无法登陆VC)
- [物理学与PDEs]第2章第4节 激波 4.2 熵条件
- zzbower入门教程
- 使用搭建的GNS3连接交换机互联互通
- php递归遍历出文件夹下的所有文件和删除文件夹下的所有文件
- OpenGL ES EGL eglQueryContext
- pycharm PEP8规范(python)
- 怎样存钱力最大c语言,C语言问题 、//14.怎样存钱利最大 //假设银行整存整取存款不同期限的 月息利率 分别为: 0.63% 期限=1年 0....
- S5PV210 GPIO 操作
- word分词器、ansj分词器、mmseg4j分词器、ik-analyzer分词器分词效果评估
- IT人士最容易得的癌症