websocket-client es un cliente WebSocket para Python. Proporciona acceso a API de bajo nivel para WebSockets. websocket-client implementa la versión hybi-13 del protocolo WebSocket. Este cliente actualmente no admite la extensión permessage-deflate de RFC 7692.
La documentación de este proyecto se puede encontrar en https://websocket-client.readthedocs.io/
Por favor consulte las pautas de contribución.
Puede usar pip install websocket-client
para instalar o pip install -e .
para instalar desde una copia local del código. Este módulo está probado en Python 3.9+.
Hay varias dependencias opcionales que se pueden instalar para habilitar funciones específicas del cliente websocket.
python-socks
para uso de proxy y wsaccel
para un aumento menor del rendimiento, use: pip install websocket-client[optional]
websockets
para ejecutar pruebas unitarias usando el servidor de eco local, use: pip install websocket-client[test]
Sphinx
y sphinx_rtd_theme
para crear la documentación del proyecto, use: pip install websocket-client[docs]
Si bien no es una dependencia estricta, rel es útil cuando se usa run_forever
con reconexión automática. Instale rel con pip install rel
.
Nota al pie: algunos shells, como zsh, requieren que se escapen los caracteres [
y ]
con un .
Consulte las preguntas frecuentes de la documentación para obtener pautas adicionales: https://websocket-client.readthedocs.io/en/latest/faq.html
Los problemas conocidos con esta biblioteca incluyen la falta de soporte de compresión WebSocket (RFC 7692) y documentación/soporte mínimo de subprocesos.
Los métodos send
y validate_utf8
a veces pueden suponer un cuello de botella. Puede deshabilitar la validación UTF8 en esta biblioteca (y recibir una mejora de rendimiento) con el parámetro skip_utf8_validation
. Si desea obtener un mejor rendimiento, instale wsaccel. Si bien websocket-client no depende de wsaccel, se utilizará si está disponible. wsaccel duplica la velocidad de validación UTF8 y ofrece un aumento mínimo del rendimiento del 10 % al enmascarar los datos de la carga útil como parte del proceso send
. Numpy solía ser una alternativa sugerida para mejorar el rendimiento, pero en el número 687 se descubrió que no ayudaba.
Se encuentran muchos más ejemplos en la documentación de ejemplos.
La mayoría de las situaciones de WebSockets del mundo real implican conexiones de mayor duración. El bucle run_forever
de WebSocketApp intentará volver a conectarse automáticamente a una conexión WebSocket abierta cuando se pierda una conexión de red si se proporciona con:
dispatcher
(despachador asíncrono como rel o pyevent)reconnect
distinto de cero (retraso entre la desconexión y el intento de reconexión) run_forever
proporciona una variedad de controles de conexión basados en eventos mediante devoluciones de llamada como on_message
y on_error
. run_forever
no se vuelve a conectar automáticamente si el servidor cierra el WebSocket correctamente (devolviendo un código de cierre de websocket estándar). Ésta es la lógica detrás de la decisión. La personalización del comportamiento cuando el servidor cierra el WebSocket debe manejarse en la devolución de llamada on_close
. Este ejemplo utiliza rel para que el despachador proporcione reconexión automática.
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 ()
Esto es si desea comunicar un mensaje corto y desconectarse inmediatamente cuando haya terminado. Por ejemplo, si desea confirmar que un servidor WebSocket se está ejecutando y responde correctamente a una solicitud específica.
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 ()