websocket-client ist ein WebSocket-Client für Python. Es bietet Zugriff auf Low-Level-APIs für WebSockets. websocket-client implementiert Version hybi-13 des WebSocket-Protokolls. Dieser Client unterstützt derzeit nicht die Permessage-Deflate-Erweiterung von RFC 7692.
Die Dokumentation dieses Projekts finden Sie unter https://websocket-client.readthedocs.io/
Bitte beachten Sie die Beitragsrichtlinien
Sie können zum Installieren pip install websocket-client
oder pip install -e .
zur Installation von einer lokalen Kopie des Codes. Dieses Modul wurde auf Python 3.9+ getestet.
Es gibt mehrere optionale Abhängigkeiten, die installiert werden können, um bestimmte Websocket-Client-Funktionen zu aktivieren.
python-socks
für die Proxy-Nutzung und wsaccel
für eine geringfügige Leistungssteigerung zu installieren, verwenden Sie: pip install websocket-client[optional]
websockets
zu installieren, um Unit-Tests mit dem lokalen Echo-Server auszuführen, verwenden Sie: pip install websocket-client[test]
Sphinx
und sphinx_rtd_theme
zum Erstellen der Projektdokumentation zu installieren, verwenden Sie: pip install websocket-client[docs]
Obwohl es sich nicht um eine strikte Abhängigkeit handelt, ist rel nützlich, wenn run_forever
mit automatischer Wiederverbindung verwendet wird. Installieren Sie rel mit pip install rel
.
Fußnote: Bei einigen Shells wie zsh müssen Sie die Zeichen [
und ]
mit einem maskieren.
Weitere Richtlinien finden Sie in den FAQ der Dokumentation: https://websocket-client.readthedocs.io/en/latest/faq.html
Zu den bekannten Problemen mit dieser Bibliothek gehören die fehlende WebSocket-Komprimierungsunterstützung (RFC 7692) und die minimale Threading-Dokumentation/-Unterstützung.
Die Methoden send
und validate_utf8
können manchmal einen Engpass darstellen. Mit dem Parameter skip_utf8_validation
können Sie die UTF8-Validierung in dieser Bibliothek deaktivieren (und eine Leistungssteigerung erhalten). Wenn Sie eine bessere Leistung erzielen möchten, installieren Sie wsaccel. Während websocket-client nicht von wsaccel abhängt, wird es verwendet, sofern verfügbar. wsaccel verdoppelt die Geschwindigkeit der UTF8-Validierung und bietet eine geringfügige Leistungssteigerung von 10 %, wenn die Nutzdaten als Teil des send
maskiert werden. Numpy war früher eine empfohlene Alternative zur Leistungssteigerung, aber Problem Nr. 687 ergab, dass es nicht half.
Viele weitere Beispiele finden Sie in der Beispieldokumentation.
Bei den meisten realen WebSockets-Situationen handelt es sich um langlebigere Verbindungen. Die WebSocketApp run_forever
Schleife versucht automatisch, die Verbindung zu einer offenen WebSocket-Verbindung wiederherzustellen, wenn eine Netzwerkverbindung verloren geht, sofern sie über Folgendes verfügt:
dispatcher
Argument (asynchroner Dispatcher wie rel oder pyevent)reconnect
Argument ungleich Null (Verzögerung zwischen Verbindungstrennung und versuchter Reconnection) run_forever
bietet eine Vielzahl ereignisbasierter Verbindungssteuerungen mithilfe von Rückrufen wie on_message
und on_error
. run_forever
stellt die Verbindung nicht automatisch wieder her, wenn der Server den WebSocket ordnungsgemäß schließt (und einen Standard-WebSocket-Schließcode zurückgibt). Das ist die Logik hinter der Entscheidung. Das Anpassen des Verhaltens beim Schließen des WebSocket durch den Server sollte im on_close
-Rückruf behandelt werden. In diesem Beispiel wird rel für den Dispatcher verwendet, um eine automatische Wiederverbindung bereitzustellen.
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 ()
Dies ist der Fall, wenn Sie eine kurze Nachricht übermitteln und die Verbindung sofort trennen möchten, wenn Sie fertig sind. Wenn Sie beispielsweise bestätigen möchten, dass ein WebSocket-Server ausgeführt wird und ordnungsgemäß auf eine bestimmte Anfrage reagiert.
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 ()