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+
มีการพึ่งพาทางเลือกหลายอย่างที่สามารถติดตั้งเพื่อเปิดใช้งานคุณลักษณะ websocket-client เฉพาะได้
python-socks
สำหรับการใช้งานพร็อกซีและ wsaccel
เพื่อเพิ่มประสิทธิภาพเล็กน้อย ให้ใช้: pip install websocket-client[optional]
websockets
เพื่อรันการทดสอบหน่วยโดยใช้เซิร์ฟเวอร์ echo ในเครื่อง ให้ใช้: 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
loop จะพยายามเชื่อมต่อกับการเชื่อมต่อ WebSocket แบบเปิดอีกครั้งโดยอัตโนมัติเมื่อการเชื่อมต่อเครือข่ายขาดหายไปหากมีให้มาพร้อมกับ:
dispatcher
(โปรแกรมเลือกจ่ายงานแบบ async เช่น 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 ()