python实现的websocket总结 —— wspy

之前曾有php版的websocket封装包,见Websocket——php实战,最近使用python做一些功能,需要用到对websocket的操作,因此,参照之前的实现,实现了这个python版本。源码见https://github.com/OshynSong/wspy

整体实现起来,需要在建立socket监听端口,这需要用到socket标准库模块;之后,需要对对网络字节流进行操作,这个方面python有struct标准库模块,这个非常好用;另外涉及到加密解密操作,还有hashlib模块和sha模块等使用。特别在此总结一下,目的主要是

1 备忘

2. 总结与思考

1 socket 操作

1 本地Socket建立

建立TCP服务器的一般流程:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((addr,port))
sock.listen(10)

建立好本地socket,并绑定地址与端口进行监听。

2 并发连接策略

之后,需要使用不同的策略处理多个客户端连接的问题,最普通的处理方式就是直接使用accept阻塞,这样服务器端每次只能处理一个客户端连接。然后python标准库提供了select模块,里面有select、poll和epoll这些不同的并发连接的处理策略。其中poll和epoll只能在linux下使用,而且epoll在linux 2.6之后的版本才能使用。当然并发处理效果来看,epoll比poll性能更好,poll比select性能更优。但是select确可以在多种平台下使用,为了兼容Windows系统,本次实现中使用的是select策略,具体如下:

... #接上述socket建立代码
while True:
    rs, ws, es = select.select([sock], [], [])
    for r in rs:
        if r is sock: #r 是服务器端socket
            cliSock,addr = r.accept()
            r.connect(cliSock) #建立于客户端连接
        else:
            try:
                data = r.recv(bufferLen)
                ... #处理客户端连接发送的数据
     ...

poll方法也是select模块内的方法,使用起来比select更简单。首先使用poll建立一个poll对象,然后使用它的register方法注册一个文件描述符,unregister方法可以移除注册对象。之后可以调用poll方法得到(fd,event)格式的列表,fd是文件描述符,event代表发生的事件。event是一个位掩码,可以使用select模块的常量进行按位操作。

select模块中polling事件常量:

事件名 描述
POLLIN 读取来自文件描述符的数据
POLLPRI 读取来自文件描述符的紧急数据
POLLOUT 文件描述符的数据已准备好,可无阻塞写入
POLLERR 与文件描述符有关的错误情况
POLLHUP 挂起,连接丢失
POLLNVAL 无效请求,连接没有打开

下面是使用poll策略的示例代码:

... #接上述socket建立代码
fdmap = {sock.fileno() : s}
p = select.poll()
p.register(sock)
while True:
    events = p.poll()
    for fd,event in events:
        if fd in fdmap:  #本地socket
            c,addr = sock.accept()
            print ‘Connected from ‘, addr
            p.register(c)
            fdmap[c.fileno()] = c
        elif event & select.POLLIN:
            data = fdmap[fd].recv(buffer)
            ...#数据操作
        elif event & select.POLLERR: #断开连接
            p.unregister(fd)
            del fdmap[fd]
   ......

2 Struct处理字节数据

这个标准库模块就是用来转换python的数据值与C风格的数据类型的交互,特别是二进制文件和网络的字节数据。主要的方法:

struct.pack(fmt, v1, v2…)

struct.pack_into(fmt, buffer, offset, v1, v2…) (将v1,v2等值按照fmt格式pack到buffer字符串以offset开始的之后的位置)

struct.unpack(fmt, string)

struct.unpack_from(fmt, buffer [, offset=0])

struct.calcsize(fmt) (计算fmt的长度)

上面主要是直接使用struct模块的方法,每个fmt都需要单独进行,如果需要重用,可以使用struct提供的Struct类,使用fmt实例化Struct对象之后,调用类似方法就可以进行重用,而且这样使用对象调用的性能更好,比直接使用上述方法调用效率更高。

pack(v1,v2…)

pack_into(buffer, offset, v1, v2 …)

unpack(string)

unpack_from(buffer, offset=0)

format : 返回实例化Struct对象使用的fmt字符串

size:返回fmt字符串的长度

其中最关键的format字符串的使用。

首先是字节顺序:

Character Byte order Size Alignment
@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network (= big-endian) standard none

然后就是format使用特殊字符,见下表:

Format C Type Python type Standard size
x pad byte no value
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer 4
l long integer 4
L unsigned long integer 4
q long long integer 8
Q unsigned long long integer 8
f float float 4
d double float 8
s char[] string
p char[] string
P void * integer

3 加密解密处理

hashlib标准库模块提供了常用的所有加密解密hash方法,使用到的有:

hashlib.update(arg):将hash对象使用arg字符串更新,多次调用相当于将所有arg字符串连接到一起

hashlib.digest() : 返回传如到update方法的字符串的hash值

hashlib.hexdigest():返回hash值的十六进制字符串表示

hashlib.copy():返回一个hash值的副本

websocket中在握手阶段需要获取到客户端的key,然后使用sha1和base64进行加密处理后发送到客户端进行握手。

    sha1Encrypt = sha1(key + ‘258EAFA5-E914-47DA-95CA-C5AB0DC85B11‘).digest()
    acceptKey = base64.b64encode(sha1Encrypt)

总体来说,使用python实现这些操作非常方便,与php相比更加简洁,彰显了python语言简洁的本质!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 06:00:57

python实现的websocket总结 —— wspy的相关文章

python简单实现websocket

协议选择的是新的Hybi-10,参考文章如下: http://www.cnblogs.com/zhuweisky/p/3930780.html http://blog.mycolorway.com/2011/11/22/a-minimal-python-websocket-server/ http://blog.csdn.net/icechenbing/article/details/7407588 python代码如下: #-*- coding:utf8 -*- import threadin

python与html5 websocket开发聊天对话窗

1.下载必须的包 https://github.com/Pithikos/python-websocket-server,解压缩并把文件夹名'python-websocket-server-master' 改为'websocket' 2.websocket文件夹内只保留websocket_server文件夹和server.py 3.稍微修改server.py的源码 1 from websocket_server import WebsocketServer 2 3 # Called for ev

flask python geventwebsocket实现websocket

前端js逻辑: <html> <head></head> <body> <script type="text/javascript" src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript"> var sock = null; va

python实现建立websocket通信

实现代码如下: #websocket协议通信 import threading import time import websocket def when_message(ws, message): print('/n接收到的消息:' + message) # 当建立连接后,死循环不断输入消息发送给服务器 # 这里需要另起一个线程 def when_open(ws): print('连接成功') def run(): while True: a = input('请输入:') ws.send(a

python websocket学习使用

前言 今天看了一些资料,记录一下心得. websocket是html5引入的一个新特性,传统的web应用是通过http协议来提供支持,如果要实时同步传输数据,需要轮询,效率低下 websocket是类似socket通信,web端连接服务器后,握手成功,一直保持连接,可以理解为长连接,这时服务器就可以主动给客户端发送数据,实现数据的自动更新. 使用websocket需要注意浏览器和当前的版本,不同的浏览器提供的支持不一样,因此设计服务器的时候,需要考虑. 进一步简述 websocket是一个浏览器

python实现websocket服务器,可以在web实时显示远程服务器日志

一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上查看日志,非常麻烦,为了偷懒,能在页面点几下按钮完成工作,所以这几天查找了这方面的资料,实现了这个功能,瞬间觉的看日志什么的,太方便了,以后也可以给开发们查日志,再也不用麻烦运维了,废话少说,先看效果吧. 二.代码 在实现这功能前,看过别人的代码,发现很多都是只能在web上显示本地的日志,不能看远程

使用 HTML5 WebSocket 构建实时 Web 应用

作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas.本地存储.多媒体编程接口.WebSocket 等等.这其中有"Web 的 TCP "之称的 WebSocket 格外吸引开发人员的注意.WebSocket 的出现使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道.Web 开发人员可以非常方便地使用 WebSocket 构建实时 web 应用,开发人员的手中从此又多了一柄神兵利器.本文首先介绍

Python框架、库以及软件资源汇总

转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世界各地的程序员们都能够贡献他们的代码与创新. Python就是这样一门受到全世界各地开源社区支持的语言.Python可以用来开发各种小工具软件.web应用.科学计算.数据分析等等,Python拥有大量的流行框架,比如Django.使用Python框架时,可以根据自己的需求插入不同的模块,比如可以用S

Python 库大全

作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Awesome Python中文版来啦! 本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:github.com.欢迎加入翻译组. 原文链接:Python 资源大全 1200+收藏,600+赞,别只顾着自己私藏呀朋友们 ------------