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