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 ()