Esiste un client WebSocket implementato per Python? [chiuso]


100

Ho trovato questo progetto: http://code.google.com/p/standalonewebsocketserver/ per un server WebSocket, ma devo implementare un client WebSocket in python, più precisamente devo ricevere alcuni comandi da XMPP nel mio server WebSocket.


2
Prova Autobahn? tavendo.de/autobahn
Len Holgate

3
Poiché Autobahn è basato su Twisted, può anche valere la pena notare che Twisted ha anche un ottimo supporto per XMPP, cioè metajack.im/2008/09/04/… Puoi quindi avere Autobahn per WebSockets + XMPP in esecuzione su un'istanza Twisted . Disclaimer: sono l'autore di Autobahn.
oberstet

Risposte:


165

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

Ridicolmente facile da usare.

 sudo pip install websocket-client

Codice client di esempio:

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

Codice server di esempio:

#!/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 installFunziona bene su Windows! Sto usando ActivePython 2.7 e ho funzionato pip install websocket-cliente ha funzionato. L'unico problema era che si pythonscontrava con cygwin python, quindi ho dovuto correre esplicitamente /cygdrive/C/Python27/pythonper ottenere ActivePython
Mark Lakata

@bryan cerca come gestire il caso quando il server si disconnette, poiché ricevo errori di pipe rotti - scrivendo su un pipe / socket / fd chiuso (probabilmente il client è disconnesso) !!!
Kanwal Prakash Singh

Come faccio a passare l'URL nella riga di comando durante l'esecuzione. ad esempio, se devo fornire l'URL di ws ("ws: // localhost: 8080 / websocket") nella riga di comando .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. come ws = create_connection (sys.argv)
Soundarya Thiagarajan

1
@KanwalPrakashSingh Hai risolto il problema di disconnessione del client?
Jey

Accidenti, non usare sudo. Usa --user.
Perfi

22

Autobahn ha una buona implementazione del client websocket per Python e alcuni buoni esempi. Ho testato quanto segue con un server Tornado WebSocket e ha funzionato.

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()

hey chris, sai come si può disconnettere un client con forza dal lato server usando questo server websocket autobahn ?? quale funzione devo chiamare per farlo?
Johnydep

hey, @Johnydep yeah, credo che sia parte delle specifiche che entrambi i partecipanti a una connessione websocket possono avviare una "chiusura". Non citarmi però. Ad ogni modo, ho guardato il codice sorgente e ci sono: "dropConnection" e "sendClose", li
collegherei

2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSè l'importazione corretta per le versioni più recenti di autobahn. stackoverflow.com/questions/21381454/...
evan54

1
Probabilmente è utile spiegare cosa sta facendo il codice se intendi introdurre una nuova API.
user650261

1
supporterà wss?
Arun

10

Dato che ultimamente ho fatto un po 'di ricerca in quel campo (gennaio, '12), il client più promettente è in realtà: WebSocket per Python . Supporta un normale socket che puoi chiamare in questo modo:

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

L' clientpuò essere Threadedo in base a IOLoopda Tornado progetto. Ciò consentirà di creare un client di connessione multipla simultanea. Utile se vuoi eseguire stress test.

Il cliente espone anche i onmessage, openede closedmetodi. (Stile WebSocket).


1
Per quanto riguarda la concorrenza: abbiamo testato il client Autobahn fino a 60k connessioni WS in uscita e il server Autobahn fino a connessioni WS 180k entranti. Su Windows, questo è stato testato usando il reattore Twisted IOCP (IO Completion Ports) e su FreeBSD questo è stato testato usando il reattore kqueue. Disclaimer: sono l'autore di Autobahn.
oberstet

1
Parlando di numeri, da parte mia, ho fatto dei test estesi con Tornado Websocket (e WS-for-py) e ottengo facilmente 15k connessioni. Non tanto, ma comunque buono per un test.
kiddouk


0
  1. Dai un'occhiata al client echo sotto http://code.google.com/p/pywebsocket/ È un progetto Google.
  2. Una buona ricerca in GitHub è: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 restituisce client e server.
  3. Bret Taylor ha anche implementato web socket su Tornado (Python). Il suo post sul blog su: Web Sockets in Tornado e un'API di implementazione client è mostrato in tornado.websocket nella sezione di supporto lato client.

1
ma ho bisogno di un sobcket web in pitone senza tornado
diegueus9

@sw. L'elemento numero 3 non è valido in quanto non è un client WebSocket, ma piuttosto un server WebSocket.
Zoran Pavlovic

@ZoranPavlovic guarda: tornadoweb.org/en/stable/websocket.html ha un'implementazione del client WebSocket.
sw.

@sw. Sì, ma il collegamento al punto 3 è a un server python e un client javascript. Dovresti aggiornarlo con il nuovo URL che hai appena pubblicato e grazie per la scoperta! È esattamente quello che stavo cercando.
Zoran Pavlovic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.