wake-up-neo.com

Socket.IO-Clientbibliothek in Python

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

Ich benötige eine Client-Bibliothek, die keine Abhängigkeiten zu anderen Frameworks aufweist.

Es reicht nicht aus, nur einen der vielen Verbindungstypen zu verwenden, da der python client mit mehreren Socketio-Servern arbeiten muss, von denen beispielsweise viele keine Websockets unterstützen.

49
Ada

Die Antwort von Archie1986 war gut, wurde aber mit Socketio-Updates überholt (genauer gesagt das Protokoll: https://github.com/LearnBoost/socket.io-spec ) ... soweit ich das beurteilen kann , Sie müssen den Handshake manuell ausführen, bevor Sie eine Transportverbindung (z. B. Websockets) anfordern können. Beachten Sie, dass der folgende Code unvollständig und unsicher ist. Zum einen ignoriert er die Liste der unterstützten Transporte, die im Handshake zurückgegeben werden antworte und versuche immer einen websocket zu bekommen ... außerdem geht es davon aus, dass der handshake immer gelingt ... trotzdem ist es ein guter startpunkt

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-Websockets informieren: https://github.com/mtah/python-websocket

41
rmanna

Zunächst bin ich mir nicht sicher, warum einige Ihrer Socket.IO-Server keine Websockets unterstützen. Die Absicht von Socket.IO ist es, die Front-End-Browser-Entwicklung von Web-Apps zu vereinfachen, indem eine abstrahierte Schnittstelle zu real bereitgestellt wird Datenströme, die vom Socket.IO-Server bereitgestellt werden. Vielleicht ist Socket.IO nicht das, was Sie für Ihre Anwendung verwenden sollten? Abgesehen davon, lassen Sie mich versuchen, Ihre Frage zu beantworten ...

Zu diesem Zeitpunkt gibt es keine Socket.IO-Clientbibliotheken für Python (gevent-socketio ist kein Socket.IO-Client Bibliothek für Python ... es ist eine Socket.IO Server Bibliothek für Python) Zusammensetzen von Originalcode, um als Client direkt mit Socket.IO zu kommunizieren und dabei verschiedene Verbindungstypen zu akzeptieren.

Ich weiß, dass Sie nach einem Allheilmittel suchen, das über verschiedene Verbindungstypen (WebSocket, Long-Polling usw.) funktioniert, aber da eine Bibliothek wie diese noch nicht existiert, kann ich Ihnen zumindest eine Anleitung geben Verwenden des WebSocket-Verbindungstyps basierend auf meiner Erfahrung.

Erstellen Sie für den WebSocket-Verbindungstyp einen WebSocket-Client in Python. Installieren Sie von der Befehlszeile aus das Python WebSocket Client-Paket hier mit pip, so dass es sich auf Ihrem python Pfad wie folgt befindet:

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

Versuchen Sie anschließend Folgendes: Ersetzen Sie 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)

Zu diesem Zeitpunkt haben Sie ein Medium für die Anbindung an einen Socket.IO-Server direkt von Python. Um Nachrichten an den Socket.IO-Server zu senden, senden Sie einfach eine Nachricht über diese WebSocket-Verbindung. Damit der Socket.IO-Server eingehende Nachrichten über diesen WebSocket von Ihrem Python Socket.IO-Client aus richtig interpretieren kann, müssen Sie das Socket.IO-Protokoll einhalten und alle von Ihnen verwendeten Zeichenfolgen oder Wörterbücher codieren wird möglicherweise über die WebSocket-Verbindung gesendet. Wenn Sie beispielsweise alle oben genannten Schritte ausgeführt haben, gehen Sie wie folgt vor:

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)
25
Archie1986

Die Bibliothek socketIO-client unterstützt Event-Callbacks und -Kanäle dank der Arbeit von Mitwirkenden und ist unter PyPI unter der Lizenz MIT= verfügbar.

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 für einen 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)
22
Roy Hyunjin Han

Das SocketTornad.IO Bibliothek mit dem beliebten asynchronen Tornado-Webserver ist auch eine der verfügbaren Optionen für Python.

5
Sushant Khurana

Schrieb eine: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py . Es werden nur Websockets unterstützt, sodass es möglicherweise nur einen geringfügigen Nutzen für Sie hat.

4
Amit Upadhyay

Hast du dir gevent-socketio angesehen?

Ich hoffe es hilft.

2
Sylvain