Asynchronous WebSocket Client .
Project description
# aiowebsocket: Asynchronous websocket client
AioWebSocket is an asynchronous WebSocket client that follows the WebSocket specification
and is lighter and faster than other libraries.
AioWebSocket是一个遵循 WebSocket 规范的异步 WebSocket 客户端,相对于其他库它更轻、更快。
![images](https://github.com/asyncins/asyncwsc/blob/master/images/aiowebsocket.jpg)
```
Why is it Lighter?
Code volume just 30 KB
Why is it Faster?
it is based on asyncio and asynchronous
```
# Installation
```
pip install aiowebsocket
```
# Usage(ws)
```
# examples.py
from aiowebsocket import AioWebsocket
from converses import AioWebSocket
async def startup(uri):
async with AioWebSocket(uri) as aws:
converse = aws.manipulator
message = b'AioWebSocket - Async WebSocket Client'
while True:
await converse.send(message)
print('{time}-Client send: {message}'
.format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), message=message))
mes = await converse.receive()
print('{time}-Client receive: {rec}'
.format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rec=mes))
if __name__ == '__main__':
remote = 'ws://echo.websocket.org'
try:
asyncio.get_event_loop().run_until_complete(startup(remote))
except KeyboardInterrupt as exc:
logging.info('Quit.')
```
# Usage(wss)
The relationship between WSS and WS is just like HTTPS and HTTP. If you need to use the WSS protocol, you only need to add SSL = True when connecting:
```
# examples.py
import asyncio
import logging
from datetime import datetime
from converses import AioWebSocket
async def startup(uri):
async with AioWebSocket(uri, ssl=True) as aws:
converse = aws.manipulator
message = b'AioWebSocket - Async WebSocket Client'
while True:
await converse.send(message)
print('{time}-Client send: {message}'
.format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), message=message))
mes = await converse.receive()
print('{time}-Client receive: {rec}'
.format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rec=mes))
if __name__ == '__main__':
remote = 'wss://echo.websocket.org'
try:
asyncio.get_event_loop().run_until_complete(startup(remote))
except KeyboardInterrupt as exc:
logging.info('Quit.')
```
# 开发故事
在开发 asyncwsc 库之前,我参考了 websocket-client 和 websockets 这两个库,在阅读过源码以及使用过后觉得 WebSocket 的连接应该与这两个库一样方便,但是在速度和代码结构上还可以更清晰,所以在完全不懂 WebSocket 的情况下通过阅读、调试源码以及翻阅资料:
* Python 网络和进程间通信 https://docs.python.org/3/library/ipc.html
* WebSocket 规范 https://tools.ietf.org/html/rfc6455#section-1.2
* websocket-client https://github.com/websocket-client/websocket-client
* WebSockets https://github.com/aaugustin/websockets
* Python Web学习笔记之WebSocket 通信过程与实现 https://www.cnblogs.com/JetpropelledSnake/p/9033064.html#_label1
* python---websocket的使用 https://www.cnblogs.com/ssyfj/p/9245150.html
最终用了 7 天时间完成 asyncwsc 库的设计和开发。下图是 asyncwsc 库文件结构以及类的设计图:
![images](https://github.com/asyncins/asyncwsc/blob/master/images/asyncwsc-class.png)
相比 websockets 库的结构,asyncwsc 文件结构非常清晰,并且代码量很少。由于 websockets 库用的是 asyncio 旧语法,并且通过 StreameProtocol
协议,实现自定义协议,加上功能设计不明确,所以导致它的结构比较混乱。整个 websockets 库的源码图我没有画出,但是在调试时候有绘制改进图,StreameProtocol 协议(改进草图)类似下图:
![images](https://github.com/asyncins/asyncwsc/blob/master/images/WebSocketsCommonProtocol.png)
这仅仅是协议的改进草稿,实际上源码的逻辑更为混乱。
# WebSocket 及协议相关知识
WebSocket status Code [tools.ietf.org](https://tools.ietf.org/html/rfc6455#section-7.4.1)
状态码 | 名称 | 含义描述
-|-|-
0~999 | | 保留使用 |
1000 | CLOSE_NORMAL | 正常关闭; 无论为何目的而创建, 该链接都已成功完成任务. |
1001 | CLOSE_GOING_AWAY | 终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开. |
1002 | CLOSE_PROTOCOL_ERROR | 由于协议错误而中断连接.
1003 | CLOSE_UNSUPPORTED | 由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收到了二进制数据).
1004 | | 保留. 其意义可能会在未来定义.
1005 | CLOSE_NO_STATUS | 保留. 表示没有收到预期的状态码.
1006 | CLOSE_ABNORMAL | 保留. 用于期望收到状态码时连接非正常关闭 (也就是说, 没有发送关闭帧).
1007 | Unsupported Data | 由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据).
1008 | Policy Violation | 由于收到不符合约定的数据而断开连接. 这是一个通用状态码, 用于不适合使用 1003 和 1009 状态码的场景.
1009 | CLOSE_TOO_LARGE | 由于收到过大的数据帧而断开连接.
1010 | Missing Extension | 客户端期望服务器商定一个或多个拓展, 但服务器没有处理, 因此客户端断开连接.
1011 | Internal Error | 客户端由于遇到没有预料的情况阻止其完成请求, 因此服务端断开连接.
1012 | Service Restart | 服务器由于重启而断开连接.
1013 | Try Again Later | 服务器由于临时原因断开连接, 如服务器过载因此断开一部分客户端连接.
1014 | |由 WebSocket标准保留以便未来使用.
1015 | TLS Handshake |保留. 表示连接由于无法完成 TLS 握手而关闭 (例如无法验证服务器证书).
1000–2999 | |保留用于定义此协议,其未来的修订版和在。中指定的扩展名永久和随时可用的公共规范。
3000–3999 | |保留供使用库/框架/应用程序。这些状态代码是直接在IANA注册。这些代码的解释该协议未定义。
4000–4999 | |保留供私人使用因此无法注册。这些代码可以由先前使用WebSocket应用程序之间的协议。解释这个协议未定义这些代码。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
aiowebsocket-1.0.0.dev.tar.gz
(14.8 kB
view hashes)
Built Distribution
Close
Hashes for aiowebsocket-1.0.0.dev0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e224f30b88d5a340e630b66032429b3d86e2511c73631bf7c7d4046f34918e18 |
|
MD5 | d2a752a35828c434e5158fdaf780bfb3 |
|
BLAKE2b-256 | fb3ad169613c1bdcc562cbd8c1471df1b5b0a66a99c5c45124f131307c453d28 |