Biblioteca de clientes Socket.io en Python [cerrado
-
16-10-2019 - |
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.
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.