Socket.Bibliothèque de clients IO en Python [fermé]
quelqu'un Peut-il recommander une Prise de courant.IO bibliothèque cliente pour Python? J'ai regardé autour de moi, mais les seuls que je peux trouver sont soit des implémentations de serveur, ou dépendent d'un framework tel que Twisted.
j'ai besoin d'une bibliothèque cliente qui n'a pas de dépendances sur d'autres cadres.
utiliser simplement l'un des nombreux types de connexion n'est pas suffisant, car le client python aura besoin de travailler avec plusieurs serveurs socketio, dont beaucoup ne supporteront pas les websockets, pour exemple.
6 réponses
la réponse D'Archie1986 était bonne mais est devenue périmée avec les mises à jour de socketio (plus spécifiquement, son protocole : https://github.com/LearnBoost/socket.io-spec) ... autant que je puisse 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 incomplète et l'insécurité... pour un, il ignore la liste des transports supportés retournés dans la réponse de poignée de main et tente toujours d'obtenir un websocket... il suppose aussi que la poignée de main réussit toujours... néanmoins, c'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 python-websockets: https://github.com/mtah/python-websocket
tout d'abord, je ne sais pas pourquoi certains de vos sockets.Les serveurs IO ne supportent pas les websockets...l'intention de Socket.IO est destiné à faciliter le développement des applications web par le navigateur de première ligne en fournissant une interface abstraite pour les flux de données en temps réel servis par la Socket.Serveur IO. Peut-Être Socket.IO n'est pas ce que vous devriez utiliser pour votre application? Cela mis à part, Laissez-moi essayer de répondre à votre question...
à l'heure actuelle, il n'y a pas de Socket.Io bibliothèques clientes pour Python (gevent-socketio n'est pas une Socket.IO client bibliothèque pour Python...c'est une Socket.IO serveur bibliothèque pour Python). Pour l'instant, vous allez devoir assembler du code original afin d'interfacer avec Socket.IO directement en tant que client tout en acceptant différents types de connexion.
je sais que vous cherchez un remède-tout cela fonctionne à travers différents types de connexion (WebSocket, long-polling, etc.), mais puisqu'une bibliothèque comme celle-ci n'existe pas comme je peux au moins vous donner quelques conseils sur L'utilisation du type de connexion WebSocket en me basant sur mon expérience.
pour le type de connexion WebSocket, créez un client WebSocket en Python. Depuis la ligne de commande, installez ce paquet Client WebSocket Python ici avec pip pour qu'il soit sur votre chemin python comme ça:
pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket
une fois que vous avez fait que essayer ce qui suit, remplacer SOCKET_IO_HOST
et SOCKET_IO_PORT
avec l'emplacement approprié de votre Socket.IO server:
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)
a ce point vous avez un médium d'interfaçage avec une Socket.Serveur IO directement à partir de Python. Pour envoyer des messages à la Socket.IO server envoie simplement un message via cette connexion WebSocket. Pour la prise.IO server pour interpréter correctement les messages entrants via ce WebSocket depuis votre Socket Python.Client IO, vous devez adhérer à la prise.Protocole IO et encoder toutes les chaînes ou dictionnaires que vous pourriez envoyer via le WebSocket connexion. Par exemple, après avoir accompli tout ce qui précède, faites ce qui 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)
socketIO-client la bibliothèque supporte les callbacks d'événements et les canaux grâce au travail des contributeurs et est disponible sur PyPI sous licence MIT.
Émettent 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 différents espaces de noms sur une même 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 SocketTornad.IO bibliothèque avec le populaire asynchrone Tornade Serveur Web est aussi l'une des options disponibles pour python.