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