使用asyncio在python中实现简单的websocket
simple_ws的Python项目详细描述
用python实现简单的websocket
安装
$ pip install simple_ws
用法
要测试库,克隆repo,请打开两个命令窗口并将cd放入 python ws目录
- 运行python -m http.server 8000
- 在另一个窗口中运行python ws_example.py。
- 在浏览器中打开http://localhost:8000
示例
fromsimple_wsimportWebSocketclassWSHandler(WebSocket):defon_message(self,msg,target_client):forclientinself.clients:ifclient.is_open():client.write_message(msg)defon_open(self,client):print("Client connected!")defon_close(self,client):print("Client left...")defon_ping(self,client):print("Recieved ping!")defon_pong(self,client):print("Recieved pong!")host=''port=8080ws=WSHandler(host,port)
WebSocket参数
parameter | type | default | descriptio n |
---|---|---|---|
^{tt3}$ | String | Host domain | |
^{tt4}$ | Integer | Port number for websocket | |
^{tt5}$ | Boolean | True | Whether server should ping client in a given intervall, will close connection if pong is not received |
^{tt6}$ | Integer | 5 | How often should server ping client in seconds, has no effect if ping is set to false |
^{tt7}$ | Boolean | True | Whether messages should be compressed |
^{tt8}$ | Integer | 8192 | Max size for a single websocket frame. If payload exceeds limit, the message will be split in several parts |
^{tt9}$ | Integer | 4096 | Max network buffer size |
功能
websocket
打开(自我,客户端)
当服务器打开到新客户端(客户端)的连接时调用。
defon_open(self,client):# Executes when opening a connection
打开关闭(自我,客户端)
当服务器关闭到客户端(客户端)的连接时调用。
defon_close(self,client):# Executes when closing a connection
打开消息(self、msg、client)
当服务器从客户端收到消息(msg)时调用 (客户)。消息可以是二进制或文本格式。
defon_message(self,msg,client):# Executes when server recieves a messages from client
打开(自我,客户端)
当服务器向客户端(客户端)发送ping时调用。
defon_ping(self,client):# Executes when ping is sent to a client
打开(自我,客户端)
当服务器从客户端(客户端)接收到pong时调用。
defon_pong(self,client):# Executes when pong is received from a client
客户
写入消息(self,msg,binary=false)
向客户端发送消息负载(msg)。如果binary=true,则消息 作为二进制数据发送。
# Text messageclient.write_message("Hello world")# Binary messageclient.write_message(b"0x00",binary=True)
是否打开(自行)
如果连接已通过握手,则返回true,并且是 当前打开。
关闭(自我、状态、原因)
向客户端发送关闭帧,并在之后关闭连接 要么是回应,要么是在1秒后。状态和原因不是 目前已实施。最终将导致websocket.on_close 被解雇了。
client.close(1002,"Pong not recieved")
待办事项
- 编写更多测试
- 在乒乓球帧中添加对有效载荷的支持
- 错误处理
- 清理课堂
- 执行关闭状态和原因
- 实现所有压缩配置
- 添加更多可配置性/删除硬编码常量
- 机具连接限制
外部来源
- https://tools.ietf.org/html/rfc6455
- https://tools.ietf.org/html/rfc7692
- https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
- https://www.igvita.com/2013/11/27/configuring-and-optimizing-websocket-compression/
- https://github.com/tornadoweb/tornado
- https://docs.python.org/3/library/asyncio.html