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.