websocket-client هو عميل WebSocket لـ Python. يوفر الوصول إلى واجهات برمجة التطبيقات ذات المستوى المنخفض لـ WebSockets. يقوم عميل websocket بتنفيذ الإصدار hybi-13 من بروتوكول WebSocket. لا يدعم هذا العميل حاليًا ملحق تفريغ الرسالة من RFC 7692.
يمكن العثور على وثائق هذا المشروع على 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
لتشغيل اختبارات الوحدة باستخدام خادم الصدى المحلي، استخدم: 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 Compression (RFC 7692) والحد الأدنى من وثائق/دعم الخيوط.
قد تكون طريقتا send
validate_utf8
في بعض الأحيان عنق الزجاجة. يمكنك تعطيل التحقق من صحة UTF8 في هذه المكتبة (وتلقي تحسين الأداء) باستخدام معلمة skip_utf8_validation
. إذا كنت ترغب في الحصول على أداء أفضل، قم بتثبيت wsaccel. على الرغم من أن عميل websocket لا يعتمد على 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 القياسي). وهذا هو المنطق وراء القرار. يجب التعامل مع تخصيص السلوك عندما يغلق الخادم 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 ()