基于websockets状态机的协议实现

wsproto的Python项目详细描述


纯Python,纯状态机WebSocket实现

Build statusDocumentation StatusCode coverage

这个存储库包含一个websocket协议的纯python实现 堆叠。它是从头开始编写的,可以嵌入到任何程序中 选择使用,确保可以通过WebSocket进行通信,如中所定义 RFC6455,不管你的程序是什么 范式。

此存储库不提供解析层、网络层或任何规则 关于并发性。相反,它是一个纯粹的内存解决方案,定义为 数据操作和WebSocket框架。RFC6455和压缩扩展 通过RFC7692的WebSocket已完全 支持。

wsproto支持python 3.6.1或更高版本。

要安装它,只需运行:

$ pip install wsproto

用法

假设您有某种形式的网络套接字可用。wsproto客户端 连接自动生成一个HTTP请求来启动WebSocket 握手。创建WebSocket客户端连接:

fromwsprotoimportWSConnection,ConnectionTypefromwsproto.eventsimportRequestws=WSConnection(ConnectionType.CLIENT)ws.send(Request(host='echo.websocket.org',target='/'))

要创建WebSocket服务器连接:

fromwsproto.connectionimportWSConnection,ConnectionTypews=WSConnection(ConnectionType.SERVER)

每次您发送消息或呼叫ping时,或者仅当您收到传入的消息时 数据,wsproto可能会响应一些您必须发送的传出数据:

some_socket.send(ws.bytes_to_send())

两种连接类型都需要接收传入数据:

ws.receive_data(some_byte_string_of_data)

如果数据包含任何websocket消息或状态更改,wsproto将发出事件:

foreventinws.events():ifisinstance(event,Request):# only client connections get this eventws.send(AcceptConnection())elifisinstance(event,CloseConnection):# guess nobody wants to talk to us any more...elifisinstance(event,TextMessage):print('We got text!',event.data)elifisinstance(event,BytesMessage):print('We got bytes!',event.data)

查看我们的文档以获取活动的完整列表 <;https://wsproto.readthedocs.io/en/latest/api.html events>;!

测试

它通过了高速公路测试套件,在客户端和 服务器模式和使用permessage deflate。

如果要运行符合性测试,请转到符合性目录并 然后要测试客户端模式,请在一个shell中运行高速公路测试服务器:

$ wstest -m fuzzingserver -s ws-fuzzingserver.json

在另一个shell中运行测试客户端:

$ python test_client.py

要测试服务器模式,请运行测试服务器:

$ python test_server.py

在另一个shell中运行Autobahn测试客户端:

$ wstest -m fuzzingclient -s ws-fuzzingclient.json

贡献

wsproto欢迎任何人的捐款与许多其他项目不同,我们 乐于接受化妆品和小额捐款,此外 对大型功能的请求和更改

在你投稿之前(通过发行或提交请求书的方式), 请read the contribution guidelines

许可证

wsproto在mit许可下可用。有关详细信息,请参见 LICENSE存储库中的文件。

作者

wsproto由@jeamland创建,并由python hyper维护 社区。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
选项卡内的java 安卓工具栏   java接口VS API VS公共类   无法解析java。lang.ClassNotFoundException:在安卓 studio中找不到类“com.example.安卓.camera2basic.AutoFitTextureView”?   java等待线程正常完成   java在JTable中的prepareRenderer方法中编辑单元格数据是否可行?   java SessionNotCreatedException selenium webdriver   java Android Studio Gradle CreateProcess错误=2   java找不到适用于异常(int)的构造函数   javascript如何在不使用正则表达式的情况下检查输入是否为表情符号?   从JAVA运行ant时,JAVA_HOME变量不正确   long的java min值引发异常   java如何在这段代码中实现侦听器?   带有透明文本的java Android按钮   图像Java扫描仪问题(JFrame)   java模拟输入蒸汽似乎在Junit测试的第一次输入中就被吃掉了   压缩Java Deflater,现在和将来的结果相同(确定性)   java JTable getModel()。setValueAt从数组中删除第一个元素   java我有不同于编译器和计算器的价值   使用C#客户端调用基本身份验证java webservice   java相同类型的多个@Embedded字段在持久化后始终为空