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.


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

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

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


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


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.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.