Pregunta

¿Alguien puede recomendar una biblioteca de clientes Socket.io para Python? He echado un vistazo, pero los únicos que puedo encontrar son implementaciones del servidor o dependen de un marco como retorcido.

Necesito una biblioteca de clientes que no tenga dependencias en otros marcos.

Simplemente usar 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.

¿Fue útil?

Solución

La respuesta de Archie1986 fue buena, pero se ha vuelto anticuada con las actualizaciones de Socketio (más específicamente, su protocolo: https://github.com/learnboost/socket.io-spec) ... por lo que puedo decir, debe realizar el apretón de manos manualmente antes de poder pedir una conexión de transporte (por ejemplo, websockets) ... Tenga en cuenta que el código a continuación está incompleto e inseguro ... para uno, es Ignora la lista de transportes compatibles devueltos en la respuesta del apretón de manos y siempre trata de obtener un websocket ... también supone que el apretón de manos siempre tiene éxito ... Sin embargo, es un buen lugar para comenzar

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)

....

Es posible que también desee leer en Python-Websockets: https://github.com/mtah/python-webocket

Otros consejos

En primer lugar, no estoy seguro de por qué algunos de sus servidores Socket.io no admitirán WebSockets ... la intención de Socket.io es facilitar el desarrollo del navegador front-end de las aplicaciones web al proporcionar una interfaz abstracta a Real Real -Las de datos de tiempo que están atendiendo el servidor Socket.io. ¿Quizás Socket.io no es lo que debería usar para su aplicación? Aparte de eso, déjame intentar responder a tu pregunta ...

En este momento, no hay bibliotecas de clientes de Socket.io para Python (Gevent-Socketio no es un Socket.io cliente Biblioteca para Python ... es un socket.io servidor Biblioteca para Python). Por ahora, tendrá que reunir un código original para interactuar con Socket.io directamente como cliente mientras acepta varios tipos de conexión.

Sé que está buscando una cura que funcione en varios tipos de conexión (websocket, colmena larga, etc.), pero dado que una biblioteca como esta aún no existe, al menos puedo brindarle orientación sobre Uso del tipo de conexión WebSocket basado en mi experiencia.

Para el tipo de conexión WebSocket, cree un cliente WebSocket en Python. Desde la línea de comando, instale este paquete de clientes de Python WebSocket aquí con Pip para que esté en tu camino de Python como así:

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

Una vez que haya hecho eso, intente lo siguiente, reemplazando SOCKET_IO_HOST y SOCKET_IO_PORT Con la ubicación apropiada 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, tiene un medio de interfaz 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 diccionarios que pueda enviar a través de la conexión WebSocket. Por ejemplo, después de haber logrado todo lo anterior, haga 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)

los Socketio-Client La biblioteca admite devoluciones de llamada y canales de eventos gracias al trabajo de los contribuyentes y está disponible en Pypi bajo la licencia del 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)

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

Defina diferentes espacios de nombres en un solo enchufe.

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)

los Sockettornad.io Biblioteca con el popular asíncrono Servidor web de tornado También es una de las opciones disponibles para Python.

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

¿Echaste un vistazo a gevent-socketio?

Espero eso ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top