Frage

Kann jemand eine Socket.io -Client -Bibliothek für Python empfehlen? Ich habe mich umgesehen, aber die einzigen, die ich finden kann, sind entweder Server -Implementierungen oder hängen von einem Framework wie Twisted ab.

Ich brauche eine Client -Bibliothek, die keine Abhängigkeiten von anderen Frameworks hat.

Die einfache Verwendung eines der vielen Verbindungstypen reicht nicht aus, da der Python -Client mit mehreren Socketio -Servern arbeiten muss, von denen viele beispielsweise WebSockets nicht unterstützen.

War es hilfreich?

Lösung

Die Antwort von Archie1986 war gut, ist aber mit Socketio -Updates veraltet (insbesondere sein Protokoll: https://github.com/learnboost/socket.io-spec) ... soweit ich das beurteilen kann, müssen Sie den Handshake manuell ausführen, bevor Sie nach einer Transport (z. Ignoriert die Liste der unterstützten Transporte, die in der Handshake -Antwort zurückgegeben wurden, und versucht immer, ein WebSocket zu erhalten ... Außerdem wird davon ausgegangen

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)

....

Vielleicht möchten Sie sich auch über Python-Webockets nachlesen: https://github.com/mtah/python-webocket

Andere Tipps

Zunächst bin ich mir nicht sicher, warum einige Ihrer Socket.io-Server WebSockets nicht unterstützen ... Die Absicht von Socket.io besteht darin, die Browser-Entwicklung von Web-Apps zu erleichtern, indem sie eine abstrahierte Schnittstelle für Real bereitstellen -Time -Datenströme werden vom Socket.io -Server serviert. Vielleicht ist Socket.io nicht das, was Sie für Ihre Anwendung verwenden sollten? Lassen Sie mich außerdem versuchen, Ihre Frage zu beantworten ...

Zu diesem Zeitpunkt gibt es keine Socket.io-Client-Bibliotheken für Python (Gevent-Socketio ist kein Socket.io Klient Bibliothek für Python ... es ist ein Socket.io Server Bibliothek für Python). Im Moment müssen Sie einen Originalcode zusammenstellen, um mit Socket.io direkt als Client zu interfasieren und gleichzeitig verschiedene Verbindungstypen zu akzeptieren.

Ich weiß Verwenden des WebSocket -Verbindungstyps basierend auf meiner Erfahrung.

Erstellen Sie für den WebSocket -Verbindungstyp einen WebSocket -Client in Python. Installieren Sie in der Befehlszeile dieses Python WebSocket -Client -Paket hier Mit PIP, so dass es sich auf Ihrem Python -Pfad wie so befindet:

pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket

Sobald Sie dies getan haben SOCKET_IO_HOST und SOCKET_IO_PORT mit dem entsprechenden Standort Ihres Socket.io -Servers:

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)

An diesem Punkt haben Sie ein Medium der Schnittstelle mit einem Socket.IO -Server direkt von Python. So senden Sie Nachrichten an den Socket.IO -Server einfach eine Nachricht über diese WebSocket -Verbindung. Damit der Socket.IO -Server eingehende Nachrichten über dieses Websocket aus Ihrem Python Socket.IO -Client ordnungsgemäß interpretieren kann, müssen Sie sich an das Socket.io -Protokoll einhalten und alle Zeichenfolgen oder Wörterbücher codieren, die Sie möglicherweise über die WebSocket -Verbindung senden. Nachdem Sie beispielsweise alles oben erreicht haben, machen Sie Folgendes:

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)

Das Socketio-Client Die Bibliothek unterstützt Event -Rückrufe und -kanäle dank der Arbeit von Mitwirkenden und ist auf verfügbar Pypi unter der MIT -Lizenz.

Mit Rückruf ausgeben.

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)

Ereignisse definieren.

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)

Definieren Sie Ereignisse in einem Namespace.

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)

Definieren Sie verschiedene Namespaces in einem einzelnen 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)

Das Sockettornad.io Bibliothek mit dem beliebten Asynchronen Tornado -Webserver ist auch eine der Optionen für Python.

Schrieb einen: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py. Es unterstützt nur WebSockets, sodass Sie möglicherweise nur einen marginalen Nutzen für Sie haben.

Hast du einen Blick darauf angesehen? Gevent-Socketio?

Ich hoffe es hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top