websocket-client est un client WebSocket pour Python. Il donne accès aux API de bas niveau pour les WebSockets. websocket-client implémente la version hybi-13 du protocole WebSocket. Ce client ne prend actuellement pas en charge l'extension permessage-deflate de la RFC 7692.
La documentation de ce projet est disponible sur https://websocket-client.readthedocs.io/
Veuillez consulter les directives de contribution
Vous pouvez utiliser pip install websocket-client
pour installer ou pip install -e .
à installer à partir d'une copie locale du code. Ce module est testé sur Python 3.9+.
Plusieurs dépendances facultatives peuvent être installées pour activer des fonctionnalités spécifiques du client Websocket.
python-socks
pour une utilisation proxy et wsaccel
pour une amélioration mineure des performances, utilisez : pip install websocket-client[optional]
websockets
afin d'exécuter des tests unitaires à l'aide du serveur d'écho local, utilisez : pip install websocket-client[test]
Sphinx
et sphinx_rtd_theme
afin de créer la documentation du projet, utilisez : pip install websocket-client[docs]
Bien qu'il ne s'agisse pas d'une dépendance stricte, rel est utile lors de l'utilisation run_forever
avec reconnexion automatique. Installez rel avec pip install rel
.
Note de bas de page : certains shells, tels que zsh, nécessitent que vous évitiez les caractères [
et ]
avec un .
Consultez la FAQ de la documentation pour des directives supplémentaires : https://websocket-client.readthedocs.io/en/latest/faq.html
Les problèmes connus avec cette bibliothèque incluent le manque de prise en charge de la compression WebSocket (RFC 7692) et une documentation/prise en charge minimale des threads.
Les méthodes send
et validate_utf8
peuvent parfois constituer des goulots d'étranglement. Vous pouvez désactiver la validation UTF8 dans cette bibliothèque (et bénéficier d'une amélioration des performances) avec le paramètre skip_utf8_validation
. Si vous souhaitez obtenir de meilleures performances, installez wsaccel. Bien que websocket-client ne dépende pas de wsaccel, il sera utilisé s'il est disponible. wsaccel double la vitesse de validation UTF8 et offre une très légère amélioration des performances de 10 % lors du masquage des données utiles dans le cadre du processus send
. Numpy était autrefois une alternative suggérée pour améliorer les performances, mais le numéro 687 a révélé que cela n'aidait pas.
De nombreux autres exemples se trouvent dans la documentation des exemples.
La plupart des situations WebSockets du monde réel impliquent des connexions de plus longue durée. La boucle WebSocketApp run_forever
tentera automatiquement de se reconnecter à une connexion WebSocket ouverte lorsqu'une connexion réseau est perdue si elle est fournie avec :
dispatcher
(répartiteur asynchrone comme rel ou pyevent)reconnect
non nul (délai entre la déconnexion et la tentative de reconnexion) run_forever
fournit une variété de contrôles de connexion basés sur des événements utilisant des rappels comme on_message
et on_error
. run_forever
ne se reconnecte pas automatiquement si le serveur ferme le WebSocket correctement (renvoyant un code de fermeture Websocket standard). C’est la logique derrière la décision. La personnalisation du comportement lorsque le serveur ferme le WebSocket doit être gérée dans le rappel on_close
. Cet exemple utilise rel pour que le répartiteur fournisse une reconnexion automatique.
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 ()
C'est le cas si vous souhaitez communiquer un court message et vous déconnecter immédiatement une fois terminé. Par exemple, si vous souhaitez confirmer qu'un serveur WebSocket est en cours d'exécution et répond correctement à une requête spécifique.
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 ()