Ist ein WebSocket-Client für Python implementiert? [geschlossen]

100

Ich habe dieses Projekt gefunden: http://code.google.com/p/standalonewebsocketserver/ für einen WebSocket-Server, aber ich muss einen WebSocket-Client in Python implementieren, genauer gesagt, ich muss einige Befehle von XMPP auf meinem WebSocket-Server empfangen.

diegueus9
quelle
2
Autobahn versuchen? tavendo.de/autobahn
Len Holgate
3
Da Autobahn auf Twisted basiert, kann es auch erwähnenswert sein, dass Twisted auch XMPP sehr gut unterstützt, dh metajack.im/2008/09/04/…. Sie können Autobahn für WebSockets + XMPP somit auf einer Twisted-Instanz ausführen . Haftungsausschluss: Ich bin der Autor von Autobahn.
Oberstet

Antworten:

165

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

Lächerlich einfach zu bedienen.

 sudo pip install websocket-client

Beispiel für einen Clientcode:

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

Beispielservercode:

#!/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 Hunt
quelle
4
@SSHThis pip installfunktioniert gut unter Windows! Ich benutze ActivePython 2.7 und lief pip install websocket-clientund es hat einfach funktioniert. Das einzige Problem war, dass es pythonmit Cygwin Python kollidierte, also musste ich explizit laufen /cygdrive/C/Python27/python, um ActivePython zu bekommen
Mark Lakata
@Bryan Hunt, wie man mit dem Fall umgeht, wenn der Server die Verbindung trennt, da ich Fehler in der Rohrleitung bekomme - Schreiben in eine geschlossene Leitung / Socket / FD (wahrscheinlich hat der Client die Verbindung getrennt) !!!
Kanwal Prakash Singh
Wie übergebe ich die URL in der Befehlszeile beim Ausführen? Zum Beispiel, wenn ich die URL von ws ("ws: // localhost: 8080 / websocket") in der Befehlszeile angeben muss. ws = create_connection ("ws: // localhost: 8080 / websocket") .. wie ws = create_connection (sys.argv)
Soundarya Thiagarajan
1
@KanwalPrakashSingh Haben Sie das Problem mit der Client-Trennung gelöst?
Jey
Meine Güte, nicht benutzen sudo. Verwenden Sie --user.
Perfi
22

Autobahn hat eine gute Websocket-Client-Implementierung für Python sowie einige gute Beispiele. Ich habe Folgendes mit einem Tornado WebSocket-Server getestet und es hat funktioniert.

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
quelle
Hey Chris, weißt du, wie man einen Client mit diesem Autobahn-Websocket-Server gewaltsam von der Serverseite trennen kann? Welche Funktion muss ich dazu aufrufen?
Johnydep
hey, @Johnydep Ja, ich glaube, es ist Teil der Spezifikation, dass beide Teilnehmer an einer Websocket-Verbindung ein "Schließen" initiieren können. Zitiere mich aber nicht. Wie auch immer, ich habe mir den Quellcode angesehen und es gibt: "dropConnection" und "sendClose" Ich würde sie einfach einstecken und testen :)
chrisallick
2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSist der richtige Import für neuere Versionen der Autobahn. stackoverflow.com/questions/21381454/…
evan54
1
Es ist wahrscheinlich gut zu erklären, was der Code tut, wenn Sie eine neue API einführen.
user650261
1
wird es wss unterstützen?
Arun
10

Da ich in letzter Zeit ein wenig auf diesem Gebiet geforscht habe (Januar '12), ist der vielversprechendste Client tatsächlich: WebSocket for Python . Es unterstützt einen normalen Socket, den Sie wie folgt aufrufen können:

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

Das clientkann sein , Threadedoder auf der Grundlage IOLoopvon Tornado - Projekt. Auf diese Weise können Sie einen Client für mehrere gleichzeitige Verbindungen erstellen. Nützlich, wenn Sie Stresstests durchführen möchten.

Der Kunde setzt auch die onmessage, openedund closedMethoden. (WebSocket-Stil).

Kiddouk
quelle
1
In Bezug auf die Parallelität: Wir haben Autobahn-Clients mit bis zu 60.000 WS-ausgehenden Verbindungen und Autobahn-Server mit bis zu 180.000 WS-Verbindungen getestet. Unter Windows wurde dies mit einem Twisted-laufenden IOCP-Reaktor (IO Completion Ports) getestet, und unter FreeBSD wurde dies mit einem Kqueue-Reaktor getestet. Haftungsausschluss: Ich bin der Autor von Autobahn.
Oberstet
1
Wenn ich über Zahlen spreche, habe ich einige erweiterte Tests mit Tornado Websocket (und WS-for-py) durchgeführt und bekomme leicht 15.000 Verbindungen. Nicht so viel, aber trotzdem gut für einen Test.
Kiddouk
0

web2py hat comet_messaging.py, das Tornado für Websockets verwendet. Ein Beispiel finden Sie hier: http://vimeo.com/18399381 und hier vimeo. com / 18232653

Bruno Rocha - Rochacbruno
quelle
Videos sind ein schlechtes Mittel, um solche Dinge zu erklären. Bitte erwägen Sie, sie in HTML-basierten Dokumentationen oder Tutorials zu veröffentlichen.
Chris Withers
0
  1. Schauen Sie sich den Echo-Client unter http://code.google.com/p/pywebsocket/ an. Es handelt sich um ein Google-Projekt.
  2. Eine gute Suche in Github ist: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 Es werden Clients und Server zurückgegeben.
  3. Bret Taylor implementierte auch Web-Sockets über Tornado (Python). Sein Blogbeitrag unter: Web Sockets in Tornado und eine Client-Implementierungs-API finden Sie unter tornado.websocket im Abschnitt zur clientseitigen Unterstützung.
sw.
quelle
1
aber ich brauche ein Web-Sobcket in Python ohne Tornado
diegueus9
@sw. Die Artikelnummer 3 ist nicht gültig, da es sich nicht um einen WebSocket-Client handelt, sondern um einen WebSocket-Server.
Zoran Pavlovic
@ZoranPavlovic siehe: tornadoweb.org/en/stable/websocket.html Es gibt eine WebSocket-Client-Implementierung.
sw.
@sw. Ja, aber der Link in Punkt 3 führt zu einem Python-Server und einem Javascript-Client. Sie sollten es mit der neuen URL aktualisieren, die Sie gerade gepostet haben, und danke für den Fund! Es ist genau das, wonach ich gesucht habe.
Zoran Pavlovic