Apakah ada klien WebSocket yang diimplementasikan untuk Python? [Tutup]

100

Saya menemukan proyek ini: http://code.google.com/p/standalonewebsocketserver/ untuk server WebSocket, tetapi saya perlu menerapkan klien WebSocket dengan python, lebih tepatnya saya perlu menerima beberapa perintah dari XMPP di server WebSocket saya.

diegueus9
sumber
2
Coba Autobahn? tavendo.de/autobahn
Len Holgate
3
Karena Autobahn didasarkan pada Twisted, perlu juga dicatat bahwa Twisted juga memiliki dukungan yang sangat baik untuk XMPP, yaitu metajack.im/2008/09/04/… Anda dengan demikian dapat menjalankan Autobahn untuk WebSockets + XMPP pada satu instance Twisted . Penafian: Saya adalah penulis Autobahn.
oberstet

Jawaban:

165

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

Sangat mudah digunakan.

 sudo pip install websocket-client

Contoh kode klien:

#!/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()

Contoh kode server:

#!/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()
Bryan berburu
sumber
4
@SSHIni pip installberfungsi dengan baik di windows! Saya menggunakan ActivePython 2.7 dan berlari pip install websocket-clientdan berhasil. Satu-satunya masalah adalah pythonbentrok dengan cygwin python, jadi saya harus secara eksplisit menjalankan /cygdrive/C/Python27/pythonuntuk mendapatkan ActivePython
Mark Lakata
@ Bryan berburu bagaimana menangani kasus ketika server terputus, seperti pada saya mendapatkan kesalahan pipa rusak - menulis ke pipa tertutup / soket / fd (mungkin klien terputus) !!!
Kanwal Prakash Singh
Bagaimana cara mengirimkan url di baris perintah saat menjalankan. misalnya jika saya perlu memberikan url ws ("ws: // localhost: 8080 / websocket") di commandline .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. seperti ws = create_connection (sys.argv)
Soundarya Thiagarajan
1
@KanwalPrakSing Apakah Anda memecahkan masalah pemutusan klien?
Jey
Ya ampun, jangan gunakan sudo. Gunakan --user.
Perfi
22

Autobahn memiliki implementasi klien websocket yang bagus untuk Python serta beberapa contoh yang bagus. Saya menguji yang berikut ini dengan server Tornado WebSocket dan berhasil.

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()
chrisallick.dll
sumber
hey chris, tahukah Anda bagaimana cara memutuskan klien secara paksa dari sisi server menggunakan server websocket autobahn ini ?? fungsi apa yang harus saya panggil untuk melakukan itu?
Johnydep
hey, @Johnydep ya, saya yakin itu adalah bagian dari spesifikasi bahwa kedua peserta dalam koneksi websocket dapat memulai "penutupan". Tapi jangan mengutip saya. Bagaimanapun, saya melihat kode sumber dan ada: "dropConnection" dan "sendClose" saya baru saja menghubungkannya dan mengujinya :)
chrisallick
2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSadalah impor yang benar untuk versi autobahn yang lebih baru. stackoverflow.com/questions/21381454/…
evan54
1
Mungkin bagus untuk menjelaskan apa yang dilakukan kode jika Anda akan memperkenalkan API baru.
pengguna650261
1
apakah itu akan mendukung wss?
Arun
10

Karena saya telah melakukan sedikit penelitian di bidang itu akhir-akhir ini (Jan, '12), klien yang paling menjanjikan sebenarnya adalah: WebSocket for Python . Ini mendukung soket normal yang dapat Anda panggil seperti ini:

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

The clientbisa Threadedatau berdasarkan IOLoopdari Tornado proyek. Ini akan memungkinkan Anda membuat klien koneksi serentak multi. Berguna jika Anda ingin menjalankan tes stres.

Klien juga mengekspos metode onmessage, openeddan closed. (Gaya WebSocket).

kiddouk
sumber
1
Mengenai konkurensi: kami telah menguji klien Autobahn hingga koneksi keluar 60k WS dan server Autobahn hingga koneksi masuk 180k WS. Pada Windows, ini diuji menggunakan reaktor Twisted running IOCP (IO Completion Ports) dan pada FreeBSD ini diuji menggunakan reaktor kqueue. Penafian: Saya adalah penulis Autobahn.
oberstet
1
Berbicara tentang angka, di pihak saya, saya telah melakukan beberapa tes tambahan dengan Tornado Websocket (dan WS-for-py) dan saya dengan mudah mendapatkan koneksi 15k. Tidak sebanyak tapi bagus untuk ujian.
kiddouk
0

web2py memiliki comet_messaging.py, yang menggunakan Tornado untuk websockets lihat contohnya di sini: http://vimeo.com/18399381 dan di sini vimeo. com / 18232653

Bruno Rocha - rochacbruno
sumber
video adalah sarana yang buruk untuk menjelaskan hal-hal seperti ini, harap pertimbangkan untuk memposting ke dokumentasi atau tutorial berbasis html.
Chris Withers
0
  1. Lihatlah klien gema di bawah http://code.google.com/p/pywebsocket/ Ini adalah proyek Google.
  2. Pencarian yang bagus di github adalah: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 mengembalikan klien dan server.
  3. Bret Taylor juga menerapkan soket web di atas Tornado (Python). Posting blognya di: Web Sockets di Tornado dan API implementasi klien ditampilkan di tornado.websocket di bagian dukungan sisi klien.
sw.
sumber
1
tapi saya butuh web sobcket dengan python tanpa tornado
diegueus9
@. Item nomor 3 tidak valid karena ini bukan klien WebSocket, melainkan server WebSocket.
Zoran Pavlovic
@ZoranPavlovic lihat: tornadoweb.org/en/stable/websocket.html memiliki implementasi klien WebSocket.
sw.
@. Ya, tetapi tautan pada poin 3 adalah ke server python dan klien javascript. Anda harus memperbaruinya dengan url baru yang baru saja Anda posting, dan terima kasih atas penemuannya! Itu persis seperti yang saya cari.
Zoran Pavlovic