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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top