websocket-client 是 Python 的 WebSocket 客户端。它提供对 WebSocket 低级 API 的访问。 websocket-client 实现了 WebSocket 协议的 hybi-13 版本。此客户端当前不支持 RFC 7692 中的 permessage-deflate 扩展。
该项目的文档可以在 https://websocket-client.readthedocs.io/ 找到
请参阅贡献指南
您可以使用pip install websocket-client
进行安装,或pip install -e .
从代码的本地副本安装。该模块在 Python 3.9+ 上进行了测试。
可以安装几个可选的依赖项来启用特定的 websocket 客户端功能。
python-socks
用于代理使用和wsaccel
以稍微提升性能,请使用: pip install websocket-client[optional]
websockets
以使用本地 echo 服务器运行单元测试,请使用: pip install websocket-client[test]
Sphinx
和sphinx_rtd_theme
来构建项目文档,请使用: pip install websocket-client[docs]
虽然不是严格的依赖关系,但 rel 在使用run_forever
和自动重新连接时很有用。使用pip install rel
安装 rel 。
脚注:某些 shell(例如 zsh)要求您使用转义
[
和]
字符。
查看文档的常见问题解答以获取其他指南:https://websocket-client.readthedocs.io/en/latest/faq.html
该库的已知问题包括缺乏 WebSocket 压缩支持 (RFC 7692) 和最少的线程文档/支持。
send
和validate_utf8
方法有时可能会成为瓶颈。您可以使用skip_utf8_validation
参数禁用此库中的UTF8验证(并获得性能增强)。如果您想获得更好的性能,请安装 wsaccel。虽然 websocket-client 不依赖于 wsaccel,但如果可用,将会使用它。 wsaccel 使 UTF8 验证的速度加倍,并在send
过程中屏蔽有效负载数据时提供 10% 的性能提升。 Numpy 曾经是建议的性能增强替代方案,但问题 #687 发现它没有帮助。
在示例文档中可以找到更多示例。
大多数现实世界的 WebSocket 情况都涉及寿命较长的连接。当网络连接丢失时,如果提供以下内容,WebSocketApp run_forever
循环将自动尝试重新连接到打开的 WebSocket 连接:
dispatcher
参数(异步调度程序,如 rel 或 pyevent)reconnect
参数(断开连接和尝试重新连接之间的延迟) run_forever
使用on_message
和on_error
等回调提供各种基于事件的连接控制。如果服务器正常关闭 WebSocket(返回标准 websocket 关闭代码), run_forever
不会自动重新连接。这就是这个决定背后的逻辑。应在on_close
回调中处理服务器关闭 WebSocket 时的自定义行为。此示例使用 rel 作为调度程序来提供自动重新连接。
import websocket
import _thread
import time
import rel
def on_message ( ws , message ):
print ( message )
def on_error ( ws , error ):
print ( error )
def on_close ( ws , close_status_code , close_msg ):
print ( "### closed ###" )
def on_open ( ws ):
print ( "Opened connection" )
if __name__ == "__main__" :
websocket . enableTrace ( True )
ws = websocket . WebSocketApp ( "wss://api.gemini.com/v1/marketdata/BTCUSD" ,
on_open = on_open ,
on_message = on_message ,
on_error = on_error ,
on_close = on_close )
ws . run_forever ( dispatcher = rel , reconnect = 5 ) # Set dispatcher to automatic reconnection, 5 second reconnect delay if connection closed unexpectedly
rel . signal ( 2 , rel . abort ) # Keyboard Interrupt
rel . dispatch ()
如果您想发送一条短消息并在完成后立即断开连接,则可以使用此选项。例如,如果您想确认 WebSocket 服务器正在运行并正确响应特定请求。
from websocket import create_connection
ws = create_connection ( "ws://echo.websocket.events/" )
print ( ws . recv ())
print ( "Sending 'Hello, World'..." )
ws . send ( "Hello, World" )
print ( "Sent" )
print ( "Receiving..." )
result = ws . recv ()
print ( "Received '%s'" % result )
ws . close ()