Existe-t-il un client WebSocket implémenté pour Python? [fermé]

100

J'ai trouvé ce projet: http://code.google.com/p/standalonewebsocketserver/ pour un serveur WebSocket, mais j'ai besoin d'implémenter un client WebSocket en python, plus exactement j'ai besoin de recevoir des commandes de XMPP dans mon serveur WebSocket.

diegueus9
la source
2
Essayez Autobahn? tavendo.de/autobahn
Len Holgate
3
Étant donné qu'Autobahn est basé sur Twisted, il peut également être intéressant de noter que Twisted a également un très bon support pour XMPP, c'est-à-dire metajack.im/2008/09/04/ ... Vous pouvez ainsi faire tourner Autobahn pour WebSockets + XMPP sur une instance Twisted . Avis de non-responsabilité: Je suis l'auteur d'Autobahn.
oberstet le

Réponses:

165

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

Ridiculement facile à utiliser.

 sudo pip install websocket-client

Exemple de code client:

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

Exemple de code serveur:

#!/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
la source
4
@SSHCela pip installfonctionne très bien sur Windows! J'utilise ActivePython 2.7 et j'ai couru pip install websocket-clientet cela a juste fonctionné. Le seul problème était qu'il était en pythonconflit avec cygwin python, j'ai donc dû exécuter explicitement /cygdrive/C/Python27/pythonpour obtenir ActivePython
Mark Lakata
@bryan hunt comment gérer le cas lorsque le serveur se déconnecte, comme dans j'obtiens des erreurs de pipe cassées - écriture dans un pipe / socket / fd fermé (probablement le client déconnecté) !!!
Kanwal Prakash Singh
Comment transmettre l'URL en ligne de commande lors de l'exécution. par exemple si je dois donner l'url de ws ("ws: // localhost: 8080 / websocket") en ligne de commande .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. comme ws = create_connection (sys.argv)
Soundarya Thiagarajan
1
@KanwalPrakashSingh Avez-vous résolu le problème de déconnexion du client?
Jey
Décidément, ne l'utilise pas sudo. Utilisez --user.
Perfi
22

Autobahn a une bonne implémentation de client websocket pour Python ainsi que quelques bons exemples. J'ai testé ce qui suit avec un serveur Tornado WebSocket et cela a fonctionné.

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
la source
hey chris, savez-vous comment peut-on déconnecter un client de force du côté serveur en utilisant ce serveur websocket autobahn ?? quelle fonction dois-je appeler pour faire ça?
Johnydep
hé, @Johnydep ouais, je crois que cela fait partie de la spécification que les deux participants à une connexion Websocket peuvent initier une "fermeture". Mais ne me citez pas. Quoi qu'il en soit, j'ai regardé le code source et il y a: "dropConnection" et "sendClose", je les branche et je les teste :)
chrisallick
2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSest l'importation correcte pour les nouvelles versions d'autoroute. stackoverflow.com/questions/21381454/…
evan54
1
Il est probablement bon d'expliquer ce que fait le code si vous allez introduire une nouvelle API.
user650261
1
supportera-t-il wss?
Arun
10

Depuis que j'ai fait un peu de recherche dans ce domaine ces derniers temps (janvier 2012), le client le plus prometteur est en fait: WebSocket pour Python . Il prend en charge une socket normale que vous pouvez appeler comme ceci:

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

Le clientpeut être Threadedou sur la base IOLoopde Tornado projet. Cela vous permettra de créer un client à connexion simultanée multiple. Utile si vous souhaitez exécuter des tests de résistance.

Le client expose aussi les onmessage, openedet les closedméthodes. (Style WebSocket).

kiddouk
la source
1
En ce qui concerne la concurrence: nous avons testé le client Autobahn jusqu'à 60k connexions sortantes WS et le serveur Autobahn jusqu'à 180k connexions WS entrantes. Sur Windows, cela a été testé en utilisant le réacteur IOCP (IO Completion Ports) tournant en torsion et sur FreeBSD, cela a été testé en utilisant le réacteur kqueue. Avertissement: je suis l'auteur de Autobahn.
oberstet le
1
En parlant de chiffres, de mon côté, j'ai fait quelques tests étendus avec Tornado Websocket (et WS-for-py) et j'obtiens facilement 15k connexions. Pas autant mais bon pour un test de toute façon.
kiddouk le
0

web2py a comet_messaging.py, qui utilise Tornado pour les websockets, regardez un exemple ici: http://vimeo.com/18399381 et ici vimeo. com / 18232653

Bruno Rocha - Rochacbruno
la source
les vidéos sont un mauvais véhicule pour expliquer des choses comme celle-ci, veuillez envisager de publier dans de la documentation ou des didacticiels html.
Chris Withers
0
  1. Jetez un œil au client echo sous http://code.google.com/p/pywebsocket/ C'est un projet Google.
  2. Une bonne recherche dans github est: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 il renvoie des clients et des serveurs.
  3. Bret Taylor a également implémenté des sockets Web sur Tornado (Python). Son article de blog sur: Web Sockets dans Tornado et une API d'implémentation client sont affichés sur tornado.websocket dans la section de support côté client.
sw.
la source
1
mais j'ai besoin d'un web sobcket en python sans tornade
diegueus9
@sw. L'élément numéro 3 n'est pas valide car il ne s'agit pas d'un client WebSocket, mais plutôt d'un serveur WebSocket.
Zoran Pavlovic
@ZoranPavlovic regarde: tornadoweb.org/en/stable/websocket.html il a une implémentation de client WebSocket.
sw.
@sw. Oui, mais le lien au point 3 est vers un serveur python et un client javascript. Vous devriez le mettre à jour avec la nouvelle URL que vous venez de publier, et merci pour la découverte! C'est exactement ce que je cherchais.
Zoran Pavlovic