¿Existe un cliente WebSocket implementado para Python? [cerrado]


100

Encontré este proyecto: http://code.google.com/p/standalonewebsocketserver/ para un servidor WebSocket, pero necesito implementar un cliente WebSocket en Python, más exactamente necesito recibir algunos comandos de XMPP en mi servidor WebSocket.


2
¿Probar Autobahn? tavendo.de/autobahn
Len Holgate

3
Dado que Autobahn se basa en Twisted, también puede valer la pena señalar que Twisted también tiene muy buen soporte para XMPP, es decir, metajack.im/2008/09/04/… Por lo tanto, puede hacer que Autobahn para WebSockets + XMPP se ejecute en una instancia de Twisted . Descargo de responsabilidad: soy el autor de Autobahn.
oberstet

Respuestas:


165

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

Ridículamente fácil de usar.

 sudo pip install websocket-client

Código de cliente de muestra:

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

Código de servidor de muestra:

#!/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
@SSH ¡Esto pip installfunciona bien en Windows! Estoy usando ActivePython 2.7 y ejecuté pip install websocket-clienty simplemente funcionó. El único problema fue que pythonchocó con cygwin python, por lo que tuve que ejecutar explícitamente /cygdrive/C/Python27/pythonpara obtener ActivePython
Mark Lakata

@bryan hunt cómo manejar el caso cuando el servidor se desconecta, ya que recibo errores de tubería rota: ¡escribiendo en una tubería / socket / fd cerrada (probablemente el cliente se desconectó)!
Kanwal Prakash Singh

¿Cómo paso la URL en la línea de comandos cuando se ejecuta? por ejemplo, si necesito dar la URL de ws ("ws: // localhost: 8080 / websocket") en la línea de comandos .. ws = create_connection ("ws: // localhost: 8080 / websocket") .. como ws = create_connection (sys.argv)
Soundarya Thiagarajan

1
@KanwalPrakashSingh ¿Resolvió el problema de desconexión del cliente?
Jey

Caray, no lo uses sudo. Utilice --user.
Perfi

22

Autobahn tiene una buena implementación de cliente websocket para Python, así como algunos buenos ejemplos. Probé lo siguiente con un servidor Tornado WebSocket y funcionó.

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, ¿sabes cómo se puede desconectar a la fuerza a un cliente del lado del servidor usando este servidor websocket autobahn? ¿A qué función tengo que llamar para hacer eso?
Johnydep

Hola, @Johnydep, sí, creo que es parte de la especificación que ambos participantes en una conexión websocket puedan iniciar un "cierre". Sin embargo, no me cites. De todos modos, miré el código fuente y hay: "dropConnection" y "sendClose", simplemente los enchufaría y los probaría :)
chrisallick

2
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWSes la importación correcta para las versiones más recientes de autobahn. stackoverflow.com/questions/21381454/…
evan54

1
Probablemente sea bueno explicar qué hace el código si va a introducir una nueva API.
user650261

1
¿será compatible con wss?
Arun

10

Ya que he estado investigando un poco en ese campo últimamente (enero de 2012), el cliente más prometedor es en realidad: WebSocket para Python . Admite un socket normal al que puedes llamar así:

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

El clientpuede haber Threadedo en base a IOLooppartir de Tornado proyecto. Esto le permitirá crear un cliente de conexión simultánea múltiple. Útil si desea realizar pruebas de estrés.

El cliente también expone a los onmessage, openedy closedmétodos. (Estilo WebSocket).


1
Con respecto a la concurrencia: hemos probado el cliente Autobahn hasta 60k conexiones WS salientes y el servidor Autobahn hasta 180k conexiones WS entrantes. En Windows, esto se probó usando el reactor IOCP (IO Completion Ports) de Twisted running y en FreeBSD esto se probó usando el reactor kqueue. Descargo de responsabilidad: soy el autor de Autobahn.
oberstet

1
Hablando de números, por mi parte, hice algunas pruebas extendidas con Tornado Websocket (y WS-for-py) y obtengo fácilmente 15k conexiones. No tanto, pero bueno para una prueba de todos modos.
Kiddouk


0
  1. Eche un vistazo al cliente echo en http://code.google.com/p/pywebsocket/ Es un proyecto de Google.
  2. Una buena búsqueda en github es: https://github.com/search?type=Everything&language=python&q=websocket&repo=&langOverride=&x=14&y=29&start_value=1 devuelve clientes y servidores.
  3. Bret Taylor también implementó sockets web sobre Tornado (Python). Su publicación de blog en: Web Sockets en Tornado y una API de implementación de cliente se muestra en tornado.websocket en la sección de soporte del lado del cliente.

1
pero necesito un sobcket web en Python sin tornado
diegueus9

@SO. El artículo número 3 no es válido ya que no es un cliente WebSocket, sino un servidor WebSocket.
Zoran Pavlovic

@ZoranPavlovic mira: tornadoweb.org/en/stable/websocket.html tiene una implementación de cliente WebSocket.
sw.

@SO. Sí, pero el enlace en el punto 3 es a un servidor Python y un cliente javascript. Debería actualizarlo con la nueva URL que acaba de publicar, ¡y gracias por encontrarlo! Es exactamente lo que estaba buscando.
Zoran Pavlovic
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.