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.

46
demandé sur Ada 2011-01-21 20:53:07

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

39
répondu rmanna 2011-09-28 20:34:10

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)
24
répondu Archie1986 2011-05-31 21:03:58

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)
22
répondu Roy Hyunjin Han 2013-04-26 21:37:58

La SocketTornad.IO bibliothèque avec le populaire asynchrone Tornade Serveur Web est aussi l'une des options disponibles pour python.

5
répondu Sushant Khurana 2012-02-27 14:15:57