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.


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

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

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


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


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.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.