websocket-client — это клиент WebSocket для Python. Он обеспечивает доступ к API-интерфейсам низкого уровня для WebSockets. websocket-client реализует версию hybi-13 протокола WebSocket. Этот клиент в настоящее время не поддерживает расширение permessage-deflate из RFC 7692.
Документацию этого проекта можно найти по адресу https://websocket-client.readthedocs.io/.
Пожалуйста, ознакомьтесь с правилами внесения взносов
Вы можете использовать pip install websocket-client
для установки или pip install -e .
для установки из локальной копии кода. Этот модуль протестирован на Python 3.9+.
Существует несколько дополнительных зависимостей, которые можно установить для включения определенных функций веб-клиента.
python-socks
для использования прокси и wsaccel
для незначительного повышения производительности, используйте: pip install websocket-client[optional]
websockets
для запуска модульных тестов с использованием локального эхо-сервера, используйте: pip install websocket-client[test]
Sphinx
и sphinx_rtd_theme
для создания документации проекта, используйте: pip install websocket-client[docs]
Хотя rel не является строгой зависимостью, он полезен при использовании run_forever
с автоматическим переподключением. Установите rel с помощью pip install rel
.
Сноска. Некоторые оболочки, такие как zsh, требуют, чтобы символы [
и ]
экранировались с помощью .
Дополнительные рекомендации можно найти в разделе часто задаваемых вопросов документации: https://websocket-client.readthedocs.io/en/latest/faq.html.
Известные проблемы с этой библиотекой включают отсутствие поддержки сжатия WebSocket (RFC 7692) и минимальную документацию/поддержку потоков.
Методы send
и validate_utf8
иногда могут быть узким местом. Вы можете отключить проверку UTF8 в этой библиотеке (и получить повышение производительности) с помощью skip_utf8_validation
. Если вы хотите повысить производительность, установите wsaccel. Хотя websocket-client не зависит от wsaccel, он будет использоваться, если доступен. wsaccel удваивает скорость проверки UTF8 и обеспечивает очень незначительный прирост производительности на 10 % при маскировке полезных данных в рамках процесса send
. Раньше Numpy был предложенной альтернативой повышения производительности, но проблема № 687 обнаружила, что это не помогло.
Многие другие примеры можно найти в документации по примерам.
В большинстве реальных ситуаций с использованием WebSockets используются долгоживущие соединения. Цикл WebSocketApp run_forever
автоматически попытается повторно подключиться к открытому соединению WebSocket при потере сетевого подключения, если ему предоставлено:
dispatcher
(асинхронный диспетчер, такой как rel или pyevent)reconnect
(задержка между отключением и попыткой повторного подключения) run_forever
предоставляет различные средства управления соединениями на основе событий с использованием обратных вызовов, таких как on_message
и on_error
. run_forever
не выполняет автоматическое повторное подключение , если сервер корректно закрывает WebSocket (возвращая стандартный код закрытия веб-сокета). В этом и есть логика такого решения. Настройка поведения, когда сервер закрывает WebSocket, должна обрабатываться в обратном вызове on_close
. В этом примере диспетчер использует 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 ()