Socket.IO Client Library en Python [fermé]
-
16-10-2019 - |
Question
Quelqu'un peut-il recommander une bibliothèque client Socket.IO pour Python? J'ai eu un coup d'oeil, mais les seuls que je peux trouver sont soit des implémentations de serveur, ou dépendent d'un cadre tel que Twisted.
Je besoin d'une bibliothèque client qui n'a pas de dépendances sur d'autres cadres.
Il suffit en utilisant l'un des nombreux types de connexion ne suffit pas, car le client python devra travailler avec plusieurs serveurs socketio, dont beaucoup ne supportent pas websockets, par exemple.
La solution
La réponse de Archie1986 était bonne, mais est devenu obsolète avec socketio mises à jour (plus précisément, son protocole: https: //github.com/LearnBoost/socket.io-spec ) ... autant que je peux dire, vous devez effectuer la poignée de main manuellement avant de pouvoir demander une connexion de transport (par exemple, websockets) .. . Notez que le code ci-dessous est incomplet et peu sûr ... pour un, il ne tient pas compte de la liste des transports pris en charge renvoyées dans la réponse de poignée de main et essaie toujours d'obtenir un websocket ... aussi il suppose que la poignée de main réussit toujours ... quand même , il est un bon endroit pour commencer
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)
....
vous pouvez également lire sur python-websockets: https://github.com/mtah/ python-websocket
Autres conseils
Tout d'abord, je ne sais pas pourquoi certains de vos serveurs Socket.IO ne sera pas soutenir websockets ... l'intention de Socket.IO est de faire du développement du navigateur frontal des applications web plus facile en fournissant un Abstraite interface avec les données en temps réel flux étant servi par le serveur Socket.IO. Peut-être Socket.IO est pas ce que vous devez utiliser pour votre application? Cela mis à part, je vais essayer de répondre à votre question ...
A ce moment, il n'y a pas de bibliothèques clientes Socket.IO pour Python (gevent-socketio est pas un Socket.IO client bibliothèque Python ... il est un Socket. IO serveur bibliothèque Python). Pour l'instant, vous allez devoir reconstituer un code d'origine ensemble afin d'interface avec Socket.IO directement en tant que client tout en acceptant différents types de connexion.
Je sais que vous êtes à la recherche d'une panacée qui fonctionne à travers différents types de connexion (WebSocket, long sondages, etc.), mais comme une bibliothèque comme celle-ci n'existe pas pour l'instant, je peux au moins vous donner quelques conseils sur l'utilisation du type de connexion WebSocket en fonction de mon expérience.
Pour le type de connexion WebSocket, créez un client WebSocket en Python. A partir de la ligne de commande installer ce package client Python WebSocket avec pip afin qu'il soit sur votre chemin de python comme ceci:
pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket
Une fois que vous avez fait cela essayez ce qui suit, en remplaçant SOCKET_IO_HOST
et SOCKET_IO_PORT
avec l'emplacement approprié de votre serveur 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)
À ce stade, vous avez un moyen d'interface avec un serveur Socket.IO directement à partir de Python. Pour envoyer des messages au serveur Socket.IO envoyer simplement un message à travers cette connexion WebSocket. Pour que le serveur Socket.IO d'interpréter correctement les messages entrants par ce WebSocket de votre client Python Socket.IO, vous devez adhérer au protocole Socket.IO et encoder toutes les chaînes ou les dictionnaires que vous pouvez envoyer par la connexion WebSocket. Par exemple, une fois que vous avez accompli tout ce que ci-dessus, procédez comme suit:
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)
Le callbacks événement bibliothèque de supports socketIO-clients et canaux de grâce au travail des collaborateurs et est disponible sur PyPI sous licence MIT.
Emit avec rappel.
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)
Définir les événements.
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)
Définir les événements dans un espace de noms.
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)
Définir espaces de noms différents sur un seul support.
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)
SocketTornad.IO bibliothèque asynchrone populaire Tornado serveur Web est également l'une des options disponibles pour python.
A écrit un: https://github.com /amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py. Il ne supporte que websockets donc il peut avoir une utilité marginale pour vous.
Avez-vous un regard sur gevent-socketio ?
it helps.