Czy istnieje klient WebSocket zaimplementowany dla języka Python? [Zamknięte]

101

Znalazłem ten projekt: http://code.google.com/p/standalonewebsocketserver/ dla serwera WebSocket, ale muszę zaimplementować klienta WebSocket w pythonie, a dokładniej muszę otrzymać kilka poleceń z XMPP na moim serwerze WebSocket.

diegueus9
źródło
2
Wypróbuj Autobahn? tavendo.de/autobahn
Len Holgate
3
Ponieważ Autobahn jest oparty na Twisted, warto również zauważyć, że Twisted ma również bardzo dobre wsparcie dla XMPP, tj. Metajack.im/2008/09/04/… Możesz więc mieć Autobahn dla WebSockets + XMPP działający na jednej instancji Twisted . Zastrzeżenie: jestem autorem Autobahn.
oberstet

Odpowiedzi:

166

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

Absurdalnie łatwy w użyciu.

 sudo pip install websocket-client

Przykładowy kod klienta:

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

Przykładowy kod serwera:

#!/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
źródło
4
@SSHTo pip installdziała dobrze w systemie Windows! Używam ActivePython 2.7 i uruchomiłem pip install websocket-clienti po prostu zadziałało. Jedynym problemem było to, że pythonzderzyło się z Cygwin Python, więc musiałem jawnie uruchomić, /cygdrive/C/Python27/pythonaby uzyskać ActivePython
Mark Lakata
@bryan poluję jak sobie poradzić w przypadku rozłączenia serwera, bo w przypadku zepsutego potoku pojawiają się błędy - zapis do zamkniętego potoku / gniazda / fd (prawdopodobnie klient się rozłączył) !!!
Kanwal Prakash Singh
Jak przekazać adres URL w wierszu poleceń podczas uruchamiania. na przykład jeśli muszę podać adres URL ws ("ws: // localhost: 8080 / websocket") w linii poleceń .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. na przykład ws = create_connection (sys.argv)
Soundarya Thiagarajan
1
@KanwalPrakashSingh Czy rozwiązałeś problem z rozłączeniem klienta?
Jey,
Rany, nie używaj sudo. Użyj --user.
Perfi
23

Autobahn ma dobrą implementację klienta Websocket dla Pythona, a także kilka dobrych przykładów. Przetestowałem poniższe z serwerem Tornado WebSocket i zadziałało.

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
źródło
hej Chris, czy wiesz, jak można na siłę odłączyć klienta od strony serwera za pomocą tego serwera websocket autobahn? jaką funkcję muszę wywołać, aby to zrobić?
Johnydep,
hej, @Johnydep tak, uważam, że częścią specyfikacji jest to, że obaj uczestnicy połączenia internetowego mogą zainicjować „zamknięcie”. Nie cytuj mnie jednak. W każdym razie spojrzałem na kod źródłowy i jest tam: "dropConnection" i "sendClose" po prostu je podłączę i testuję :)
chrisallick
2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSjest prawidłowym importem dla nowszych wersji autobahn. stackoverflow.com/questions/21381454/…
evan54
1
Jeśli zamierzasz wprowadzić nowe API, prawdopodobnie dobrze jest wyjaśnić, co robi kod.
user650261
1
czy będzie obsługiwać wss?
Arun
10

Ponieważ ostatnio przeprowadziłem trochę badań w tej dziedzinie (styczeń '12), najbardziej obiecującym klientem jest właściwie: WebSocket for Python . Obsługuje normalne gniazdo, które możesz nazwać w ten sposób:

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

clientMoże być Threadedalbo na podstawie IOLoopz Tornado projektu. Umożliwi to utworzenie klienta wielu jednoczesnych połączeń. Przydatne, jeśli chcesz przeprowadzić testy warunków skrajnych.

Klient naraża również onmessage, openedi closedmetod. (Styl WebSocket).

kiddouk
źródło
1
Odnośnie współbieżności: przetestowaliśmy klienta Autobahn do 60 tys. Połączeń wychodzących WS i serwera Autobahn do przychodzących 180 tys. Połączeń WS. W systemie Windows zostało to przetestowane przy użyciu działającego reaktora IOCP (IO Completion Ports), aw systemie FreeBSD zostało to przetestowane przy użyciu reaktora kqueue. Zastrzeżenie: jestem autorem Autobahn.
oberstet
1
Mówiąc o liczbach, z mojej strony przeprowadziłem kilka rozszerzonych testów z Tornado Websocket (i WS-for-py) i łatwo uzyskuję 15k połączeń. Nie tak dużo, ale i tak dobry do testu.
kiddouk
0

web2py ma comet_messaging.py, który używa Tornado do websockets. Przykład tutaj: http://vimeo.com/18399381 i tutaj vimeo. com / 18232653

Bruno Rocha - rochacbruno
źródło
filmy wideo są kiepskim narzędziem do wyjaśniania takich rzeczy, rozważ umieszczenie w dokumentacji lub samouczkach w formacie HTML.
Chris Withers
0
  1. Przyjrzyj się klientowi echo pod adresem http://code.google.com/p/pywebsocket/ To projekt Google.
  2. Dobre wyszukiwanie na githubie to: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 zwraca klientów i serwery.
  3. Bret Taylor zaimplementował również gniazda sieciowe w Tornado (Python). Jego post na blogu pod adresem: Web Sockets in Tornado i interfejs API do implementacji klienta jest wyświetlany pod adresem tornado.websocket w sekcji wsparcia po stronie klienta.
południowy zachód.
źródło
1
ale potrzebuję internetowego sobcket w Pythonie bez tornada
diegueus9
@południowy zachód. Pozycja numer 3 jest nieprawidłowa, ponieważ nie jest to klient WebSocket, ale raczej serwer WebSocket.
Zoran Pavlovic
@ZoranPavlovic spójrz na: tornadoweb.org/en/stable/websocket.html ma implementację klienta WebSocket.
św.
@południowy zachód. Tak, ale odsyłacz w punkcie 3 prowadzi do serwera Python i klienta javascript. Powinieneś zaktualizować go nowym adresem URL, który właśnie opublikowałeś, i dziękujemy za znalezienie! Dokładnie tego szukałem.
Zoran Pavlovic,