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.


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

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

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


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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.