Socket.IO Biblioteca cliente en Python [cerrado]


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

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

Simplemente usar uno de los muchos tipos de conexión no es suficiente, ya que el cliente python necesitará trabajar con varios servidores socketio, muchos de los cuales no soportarán websockets, por ejemplo.

Author: Ada, 2011-01-21

6 answers

La respuesta de Archie1986 fue buena, pero se ha quedado obsoleta con las actualizaciones de socketio (más específicamente, su protocolo: https://github.com/LearnBoost/socket.io-spec) {por lo que puedo decir, necesita realizar el apretón de manos manualmente antes de poder solicitar una conexión de transporte (por ejemplo, websockets)... tenga en cuenta que el código a continuación es incompleto e inseguro... por un lado, ignora la lista de transportes soportados devueltos en la respuesta handshake y siempre intenta obtener un websocket... también asume 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 sobre python-websockets: https://github.com/mtah/python-websocket

 39
Author: rmanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-28 20:34:10

En primer lugar, no estoy seguro de por qué algunos de sus Socket.IO los servidores no admiten websockets...la intención de Socket.IO es hacer que el desarrollo del navegador front-end de aplicaciones web sea más fácil al proporcionar una interfaz abstracta a los flujos de datos en tiempo real que se sirven por el Socket.IO servidor. Tal vez Socket.IO ¿no es lo que deberías usar para tu aplicación? Aparte de eso, déjame tratar de responder a tu pregunta...

En este momento, no hay ninguna Socket.IO bibliotecas cliente para Python (gevent-socketio no es un Socket.IO cliente biblioteca para Python...it es un Socket.IO servidor biblioteca para Python). Por ahora, vas a tener que juntar un poco de código original para interactuar con Socket.IO directamente como cliente mientras acepta varios tipos de conexión.

Sé que está buscando una cura-todo que funcione a través de varios tipos de conexión (WebSocket, long-polling, etc.), pero como una biblioteca como esta no existe todavía, puedo al menos darle alguna orientación sobre el 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 comandos instale este paquete cliente WebSocket de Python aquí con pip para que esté en su ruta de python de la siguiente manera:

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 adecuada de su Socket.IO servidor:

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 usted tiene un medio de interfaz con un Socket.IO servidor directamente desde Python. Para enviar mensajes a la Socket.IO el servidor simplemente envía un mensaje a través de esta conexión WebSocket. Con el fin de Socket.IO servidor para interpretar correctamente los mensajes entrantes a través de este WebSocket desde su Python Socket.IO cliente, es necesario adherirse a la Socket.IO protocol y codifique 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: 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)
 24
Author: Archie1986,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 21:03:58

La biblioteca SocketIO-client soporta callbacks de eventos y canales gracias al trabajo de los colaboradores y está disponible en PyPI bajo la licencia 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)

Defina diferentes espacios de nombres en un solo socket.

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)
 22
Author: Roy Hyunjin Han,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-26 21:37:58

El SocketTornad.IO biblioteca con el popular asíncrono Servidor Web Tornado es también una de las opciones disponibles para python.

 5
Author: Sushant Khurana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-27 14:15:57

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

 4
Author: Amit Upadhyay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-17 17:36:03

¿Echaste un vistazo a gevent-socketio?

Espero que ayude.

 2
Author: Sylvain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-21 23:48:56