มีไคลเอนต์ WebSocket ที่ใช้กับ Python หรือไม่ [ปิด]


101

ฉันพบโครงการนี้: http://code.google.com/p/standalonewebsocketserver/สำหรับเซิร์ฟเวอร์ WebSocket แต่ฉันต้องติดตั้งไคลเอนต์ WebSocket ใน python ฉันต้องรับคำสั่งบางอย่างจาก XMPP ในเซิร์ฟเวอร์ WebSocket


2
ลอง Autobahn ไหม tavendo.de/autobahn
Len Holgate

3
เนื่องจาก Autobahn ใช้ Twisted จึงอาจเป็นที่น่าสังเกตว่า Twisted มีการรองรับ XMPP ที่ดีมากเช่นmetajack.im/2008/09/04/… ดังนั้นคุณสามารถให้ Autobahn สำหรับ WebSockets + XMPP ทำงานบนอินสแตนซ์ Twisted เดียวได้ . คำเตือน: ฉันเป็นผู้เขียน Autobahn
oberstet

คำตอบ:


166

http://pypi.python.org/pypi/websocket-client/

ใช้งานง่ายอย่างน่าขัน

 sudo pip install websocket-client

ตัวอย่างรหัสลูกค้า:

#!/usr/bin/python

from websocket import create_connection
ws = create_connection("ws://localhost:8080/websocket")
print "Sending 'Hello, World'..."
ws.send("Hello, World")
print "Sent"
print "Receiving..."
result =  ws.recv()
print "Received '%s'" % result
ws.close()

ตัวอย่างรหัสเซิร์ฟเวอร์:

#!/usr/bin/python
import websocket
import thread
import time

def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

def on_open(ws):
    def run(*args):
        for i in range(30000):
            time.sleep(1)
            ws.send("Hello %d" % i)
        time.sleep(1)
        ws.close()
        print "thread terminating..."
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                                on_message = on_message,
                                on_error = on_error,
                                on_close = on_close)
    ws.on_open = on_open

    ws.run_forever()

4
@SSH ใช้pip installงานได้ดีบน windows! ฉันใช้ ActivePython 2.7 และรันpip install websocket-clientและใช้งานได้จริง ปัญหาเดียวคือการpythonปะทะกับ cygwin python ดังนั้นฉันต้องวิ่งอย่างชัดเจน/cygdrive/C/Python27/pythonเพื่อรับ ActivePython
Mark Lakata

@bryan ตามล่าหาวิธีจัดการกรณีเมื่อเซิร์ฟเวอร์ตัดการเชื่อมต่อเนื่องจากฉันได้รับข้อผิดพลาดท่อแตก - เขียนไปยังท่อ / ซ็อกเก็ตที่ปิดสนิท / fd (อาจเป็นไคลเอนต์ที่ตัดการเชื่อมต่อ) !!!
Kanwal Prakash Singh

ฉันจะส่ง url ใน commandline ได้อย่างไรเมื่อทำงาน ตัวอย่างเช่นถ้าฉันต้องการให้ url ของ ws ("ws: // localhost: 8080 / websocket") ใน commandline .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. เช่น ws = create_connection (sys.argv)
Soundarya Thiagarajan

1
@KanwalPrakashSingh คุณแก้ปัญหาการตัดการเชื่อมต่อไคลเอนต์หรือไม่?
Jey

sudoโธ่ไม่ได้ใช้ ใช้--user.
Perfi

23

Autobahn มีการใช้งานไคลเอนต์ websocket ที่ดีสำหรับ Python รวมถึงตัวอย่างที่ดี ฉันทดสอบสิ่งต่อไปนี้กับเซิร์ฟเวอร์ Tornado WebSocket และใช้งานได้

from twisted.internet import reactor
from autobahn.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS


class EchoClientProtocol(WebSocketClientProtocol):

   def sendHello(self):
      self.sendMessage("Hello, world!")

   def onOpen(self):
      self.sendHello()

   def onMessage(self, msg, binary):
      print "Got echo: " + msg
      reactor.callLater(1, self.sendHello)


if __name__ == '__main__':

   factory = WebSocketClientFactory("ws://localhost:9000")
   factory.protocol = EchoClientProtocol
   connectWS(factory)
   reactor.run()

เฮ้คริสคุณรู้ไหมว่าเราจะตัดการเชื่อมต่อไคลเอนต์อย่างแรงจากฝั่งเซิร์ฟเวอร์โดยใช้เซิร์ฟเวอร์ websocket อัตโนมัตินี้ได้อย่างไร? ฉันต้องเรียกใช้ฟังก์ชันใดเพื่อทำสิ่งนั้น
Johnydep

เฮ้ @Johnydep ใช่ฉันเชื่อว่านี่เป็นส่วนหนึ่งของข้อมูลจำเพาะที่ผู้เข้าร่วมทั้งสองในการเชื่อมต่อเว็บซ็อกเก็ตสามารถเริ่ม "ปิด" ได้ อย่าอ้างฉันว่า อย่างไรก็ตามฉันดูซอร์สโค้ดแล้วมี: "dropConnection" และ "sendClose" ฉันแค่เสียบเข้าและทดสอบ :)
chrisallick

2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSเป็นการนำเข้าที่ถูกต้องสำหรับออโต้บาห์นเวอร์ชันใหม่กว่า stackoverflow.com/questions/21381454/…
evan54

1
อาจเป็นการดีที่จะอธิบายว่าโค้ดกำลังทำอะไรอยู่หากคุณกำลังจะแนะนำ API ใหม่
user650261

1
จะรองรับ wss ไหม
อรุณ

10

ตั้งแต่ผมได้รับการทำบิตของการวิจัยในสาขาที่เมื่อเร็ว ๆ นี้ ( ม.ค. '12) ที่ลูกค้ามีแนวโน้มมากที่สุดเป็นจริง: WebSocket สำหรับงูหลาม รองรับซ็อกเก็ตปกติที่คุณสามารถเรียกแบบนี้:

ws = EchoClient('http://localhost:9000/ws')

clientสามารถThreadedหรืออยู่บนพื้นฐานIOLoopจากพายุทอร์นาโดโครงการ สิ่งนี้จะช่วยให้คุณสร้างไคลเอนต์การเชื่อมต่อพร้อมกันหลายตัว มีประโยชน์หากคุณต้องการทำการทดสอบความเครียด

ลูกค้ายังตีแผ่onmessage, openedและclosedวิธีการ (แบบ WebSocket).


1
เกี่ยวกับการทำงานพร้อมกัน: เราได้ทดสอบไคลเอนต์ Autobahn ถึง 60k การเชื่อมต่อขาออก WS และเซิร์ฟเวอร์ Autobahn ถึงการเชื่อมต่อ WS 180k ขาเข้า ใน Windows สิ่งนี้ได้รับการทดสอบโดยใช้เครื่องปฏิกรณ์ IOCP (IO Completion Ports) แบบ Twisted และบน FreeBSD ซึ่งทดสอบโดยใช้เครื่องปฏิกรณ์ kqueue ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน Autobahn
oberstet

1
เมื่อพูดถึงตัวเลขแล้วฉันได้ทำการทดสอบเพิ่มเติมกับ Tornado Websocket (และ WS-for-py) และฉันได้รับการเชื่อมต่อ 15k อย่างง่ายดาย ไม่มากเท่า แต่ดีสำหรับการทดสอบอยู่ดี
kiddouk

0

web2py มี comet_messaging.py ซึ่งใช้ Tornado สำหรับ websockets ดูตัวอย่างที่นี่: http://vimeo.com/18399381และที่นี่ vimeo com / 18232653


วิดีโอเป็นเครื่องมือที่ไม่ดีในการอธิบายสิ่งต่างๆเช่นนี้โปรดพิจารณาโพสต์ลงในเอกสารหรือบทแนะนำที่ใช้ html
Chris Withers

0
  1. ดูไคลเอนต์ echo ในhttp://code.google.com/p/pywebsocket/ซึ่งเป็นโครงการของ Google
  2. การค้นหาที่ดีใน github คือ: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1ซึ่งส่งคืนไคลเอ็นต์และเซิร์ฟเวอร์
  3. Bret Taylor ยังใช้เว็บซ็อกเก็ตเหนือ Tornado (Python) โพสต์บล็อกของเขาที่: Web Sockets ใน Tornadoและ API การใช้งานไคลเอ็นต์จะแสดงที่tornado.websocketในส่วนการสนับสนุนฝั่งไคลเอ็นต์

1
แต่ฉันต้องการเว็บ sobcket ในหลามที่ไม่มีพายุทอร์นาโด
diegueus9

@sw. รายการหมายเลข 3 ไม่ถูกต้องเนื่องจากไม่ใช่ไคลเอนต์ WebSocket แต่เป็นเซิร์ฟเวอร์ WebSocket
Zoran Pavlovic

@ZoranPavlovic ดูที่: tornadoweb.org/en/stable/websocket.htmlมีการใช้งานไคลเอนต์ WebSocket
สว.

@sw. ใช่ แต่ลิงค์ในจุดที่ 3 คือไปยังเซิร์ฟเวอร์ python และไคลเอนต์ javascript คุณควรอัปเดตด้วย URL ใหม่ที่คุณเพิ่งโพสต์และขอบคุณสำหรับการค้นหา! มันคือสิ่งที่ฉันกำลังมองหา
Zoran Pavlovic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.