Socket.IO Client Library en Python

¿Alguien puede recomendar una biblioteca cliente Socket.IO para Python? He echado un vistazo alrededor, pero las únicas que puedo encontrar son implementaciones de servidor o depender de un marco como Twisted.

Necesito una biblioteca cliente 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 tendrá que trabajar con múltiples servidores socketio, muchos de los cuales no serán compatibles con websockets, por ejemplo.

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, debe realizar el protocolo de enlace. manualmente antes de que pueda solicitar una conexión de transporte (por ejemplo, websockets) … tenga en cuenta que el código a continuación está incompleto e inseguro … por un lado, ignora la lista de transportes admitidos que se devuelve en la respuesta del protocolo de enlace y siempre trata de obtener una 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 en python-websockets: https://github.com/mtah/python-websocket

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 hacer que el desarrollo de aplicaciones web para navegadores front-end sea más fácil al proporcionar una interfaz abstracta a la realidad. Los flujos de datos en tiempo real son servidos por 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 cliente Socket.IO para Python (gevent-socketio no es una biblioteca de cliente Socket.IO para Python … es una biblioteca de servidor Socket.IO para Python). Por ahora, tendrá que juntar un código original para interactuar con Socket.IO directamente como cliente mientras acepta varios tipos de conexión.

Sé que está buscando un remedio que funcione a través de varios tipos de conexión (WebSocket, long-polling, etc.), pero como no existe una biblioteca como esta, por lo menos puedo darle alguna orientación sobre utilizando el 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 de Python WebSocket Client aquí con pip para que esté en su ruta de Python así:

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

Una vez que hayas hecho eso, prueba lo siguiente, reemplaza SOCKET_IO_HOST y SOCKET_IO_PORT con la ubicación adecuada de tu 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 para 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 cumplir con el protocolo Socket.IO y codificar las cadenas o diccionarios que pueda enviar a través de la conexión WebSocket. Por ejemplo, después de haber logrado todo lo anterior, haz 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) 

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

Emitir con callback.

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

La biblioteca SocketTornad.IO con el popular Servidor Web Tornado asíncrono 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 una utilidad marginal para usted.

¿Has echado un vistazo a gevent-socketio ?

Espero eso ayude.