2011-01-21 23 views
43

¿Alguien puede recomendar una biblioteca de cliente Socket.IO para Python? He echado un vistazo, pero los únicos que puedo encontrar son implementaciones de servidor o dependen de un marco como Twisted.Biblioteca de cliente de Socket.IO en Python

Necesito una biblioteca cliente que no tenga dependencias en otros marcos.

Simplemente utilizando uno de los muchos tipos de conexión no es suficiente, ya que el cliente de python necesitará trabajar con múltiples servidores socketio, muchos de los cuales no admitirán websockets, por ejemplo.

Respuesta

38

respuesta de Archie1986 era buena, pero se ha vuelto obsoleto con socketio actualizaciones (más específicamente, su protocolo: https://github.com/LearnBoost/socket.io-spec) ... Por lo que yo puedo decir , debe realizar el saludo de mano manualmente antes de solicitar una conexión de transporte (p. ej., websockets) ... tenga en cuenta que el código siguiente es incompleto e inseguro ... por un lado, ignora la lista de transportes admitidos devueltos en el protocolo de enlace respuesta y siempre trata de obtener un websocket ... también asume que el handshake siempre tiene éxito ...sin embargo, es un buen punto de partida

import websocket, httplib 

... 

''' 
    connect to the socketio server 

    1. perform the HTTP handshake 
    2. open a websocket connection ''' 
def connect(self) : 
    conn = httplib.HTTPConnection('localhost:8124') 
    conn.request('POST','/socket.io/1/') 
    resp = conn.getresponse() 
    hskey = resp.read().split(':')[0] 

    self._ws = websocket.WebSocket(
        'ws://localhost:8124/socket.io/1/websocket/'+hskey, 
        onopen = self._onopen, 
        onmessage = self._onmessage) 

.... 

también puede que quiera leer sobre python-websockets: https://github.com/mtah/python-websocket

+3

Esto funciona muy bien para mí. ¡Muchas gracias por la respuesta actualizada! Me gustaría que el OP volviera a promocionar este, porque la respuesta real (como usted señala) no va a funcionar realmente con la especificación actual. Completé el resto del código para una herramienta de línea de comando simple que funciona bien. Podría serle útil a otra persona: https://gist.github.com/1402238 Básicamente es solo tu código con otras cosas menores que son obvias en su mayoría, pero espero que le ahorre a alguien algo de tiempo. – drewww

3

¿Echa un vistazo a gevent-socketio?

Espero que ayude.

+9

GEvent-socketio no es una biblioteca de cliente para Python Socket.IO ... es una biblioteca servidor Socket.IO para Python – Archie1986

+0

1 Realmente me ayudó, gracias. –

24

En primer lugar, no estoy seguro de por qué algunos de sus servidores Socket.IO no son compatibles con websockets ... la intención de Socket.IO es facilitar el desarrollo de aplicaciones de web de navegador de primera línea, proporcionando un interfaz abstraída a las secuencias de datos en tiempo real atendidas por el servidor Socket.IO. ¿Tal vez Socket.IO no es lo que debería usar para su aplicación? Aparte de eso, vamos a tratar de responder a su pregunta ...

En este punto en el tiempo, no no hay bibliotecas de cliente Socket.IO para Python (GEvent-socketio es un cliente Socket.IO biblioteca Python ... es una biblioteca del servidor de Socket.IO para Python). Por ahora, vas a tener que juntar algunos códigos originales para poder interactuar con Socket.IO directamente como cliente y aceptando varios tipos de conexión.

Sé que está buscando una panacea que funcione en varios tipos de conexión (WebSocket, long-polling, etc.), pero dado que una biblioteca como esta no existe hasta el momento, al menos puedo dar da algunas indicaciones sobre el uso del tipo de conexión WebSocket en función de mi experiencia.

Para el tipo de conexión WebSocket, cree un cliente WebSocket en Python. Desde la línea de comandos instalar este paquete de cliente Python WebSocket here con pip por lo que es en su camino pitón de este modo:

pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket

Una vez que hayas hecho esto Intente lo siguiente, reemplazando SOCKET_IO_HOST y SOCKET_IO_PORT con la adecuada ubicación de su servidor Socket.IO:

import websocket 

SOCKET_IO_HOST = "127.0.0.1" 
SOCKET_IO_PORT = 8080 

socket_io_url = 'ws://' + SOCKET_IO_HOST + ':' + str(SOCKET_IO_PORT) + '/socket.io/websocket' 

ws = websocket.create_connection(socket_io_url) 

en este punto se tiene un medio de interactuar con un servidor Socket.IO directamente desde Python. Para enviar mensajes al servidor Socket.IO, simplemente envíe un mensaje a través de esta conexión WebSocket. Para que el servidor Socket.IO interprete correctamente los mensajes entrantes a través de este WebSocket desde su cliente Python Socket.IO, debe adherirse al protocolo Socket.IO y codificar cualquier cadena o diccionario que pueda enviar a través de la conexión WebSocket. Por ejemplo, después de que has logrado todo por encima de hacer lo siguiente:

def encode_for_socketio(message): 
    """ 
    Encode 'message' string or dictionary to be able 
    to be transported via a Python WebSocket client to 
    a Socket.IO server (which is capable of receiving 
    WebSocket communications). This method taken from 
    gevent-socketio. 
    """ 
    MSG_FRAME = "~m~" 
    HEARTBEAT_FRAME = "~h~" 
    JSON_FRAME = "~j~" 

    if isinstance(message, basestring): 
      encoded_msg = message 
    elif isinstance(message, (object, dict)): 
      return encode_for_socketio(JSON_FRAME + json.dumps(message)) 
    else: 
      raise ValueError("Can't encode message.") 

    return MSG_FRAME + str(len(encoded_msg)) + MSG_FRAME + encoded_msg 

msg = "Hello, world!" 
msg = encode_for_socketio(msg) 
ws.send(msg) 
+0

ejemplo completo: http://pastebin.com/1Xt6X4K5 - pero realmente no estoy usando HTTP exactamente, tuve que modificar websocket.py de esta manera: http://pastebin.com/rh9WxxJA porque, sospecho que mi versión de urlparse no reconoce el protocolo de socket web 'ws: //'. –

4

escribió uno: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py. Solo admite websockets, por lo que puede que solo tenga una utilidad marginal para usted.

+0

cuando ejecuto el método 'run()' obtengo un error: 'Invalid frame' - ¿Qué podría significar eso? – Alp

+0

Alp, significa que hay un error en la biblioteca. Lo actualicé en base a los comentarios de varios colaboradores. Por favor, siéntase libre de revisar la última versión y ver si ayuda. –

+0

Gracias por su respuesta. Mientras tanto, cambié a Sockjs, que funciona como un encanto. Consulte http://stackoverflow.com/questions/10950365/python-socket-io-client-for-sending-broadcast-messages-to-tornadio2-server – Alp

5

La biblioteca SocketTornad.IO con el popular asíncrono Tornado Web Server es también una de las opciones disponibles para Python.

+2

o incluso mejor, la versión más reciente de Tornadio2: https: // github.com/mrjoes/tornadIO2 --- pero estas son librerías de servidor, no para uso como cliente. – Alp

20

La biblioteca socketIO-client admite devoluciones de llamadas de eventos y canales gracias al trabajo de los colaboradores y está disponible en PyPI bajo la licencia de MIT.

Emitir con devolución de llamada.

from socketIO_client import SocketIO 

def on_bbb_response(*args): 
    print 'on_bbb_response', args 

with SocketIO('localhost', 8000) as socketIO: 
    socketIO.emit('bbb', {'xxx': 'yyy'}, on_bbb_response) 
    socketIO.wait_for_callbacks(seconds=1) 

Definir eventos.

from socketIO_client import SocketIO 

def on_aaa_response(*args): 
    print 'on_aaa_response', args 

socketIO = SocketIO('localhost', 8000) 
socketIO.on('aaa_response', on_aaa_response) 
socketIO.emit('aaa') 
socketIO.wait(seconds=1) 

Definir eventos en un espacio de nombres.

from socketIO_client import SocketIO, BaseNamespace 

class Namespace(BaseNamespace): 

    def on_aaa_response(self, *args): 
     print 'on_aaa_response', args 
     self.emit('bbb') 

socketIO = SocketIO('localhost', 8000) 
socketIO.define(Namespace) 
socketIO.emit('aaa') 
socketIO.wait(seconds=1) 

definir diferentes espacios de nombres en una sola toma.

from socketIO_client import SocketIO, BaseNamespace 

class ChatNamespace(BaseNamespace): 

    def on_aaa_response(self, *args): 
     print 'on_aaa_response', args 

class NewsNamespace(BaseNamespace): 

    def on_aaa_response(self, *args): 
     print 'on_aaa_response', args 

socketIO = SocketIO('localhost', 8000) 
chatNamespace = socketIO.define(ChatNamespace, '/chat') 
newsNamespace = socketIO.define(NewsNamespace, '/news') 

chatNamespace.emit('aaa') 
newsNamespace.emit('aaa') 
socketIO.wait(seconds=1) 
+3

Heh, hemos cerrado el círculo, ya que el paquete socketIO-client se generó a partir de la pregunta SO relacionada: http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io -node-js-server-from-python-client –

+0

recibo la advertencia ADVERTENCIA: root: localhost: 8000/socket.io [esperando conexión] ('Conexión cancelada.', error (111, 'Conexión rechazada'))...¿puede usted ayudar? – 3ppps

+0

¿Está funcionando su servidor socket.io? ¿Qué versión del servidor socket.io estás usando? –