web-dev-qa-db-ja.com

PythonのSocket.IOクライアントライブラリ

誰でもPython用のSocket.IOクライアントライブラリを推奨できますか?私は見て回ったが、私が見つけることができる唯一のものは、サーバーの実装、またはTwistedなどのフレームワークに依存している。

他のフレームワークに依存しないクライアントライブラリが必要です。

pythonクライアントは複数のsocketioサーバーで動作する必要があるため、多くの接続タイプの1つを使用するだけでは十分ではありません。

49
Ada

Archie1986の答えは良かったが、socketioの更新で時代遅れになった(より具体的には、そのプロトコル: https://github.com/LearnBoost/socket.io-spec )...私が知る限り、トランスポート(たとえば、websockets)接続を要求する前に手動でハンドシェイクを実行する必要があります...以下のコードは不完全で安全ではないことに注意してください... 1つは、ハンドシェイクで返されるサポートされるトランスポートのリストを無視します応答し、常にWebSocketを取得しようとします...また、ハンドシェイクは常に成功すると想定しています...それにもかかわらず、開始するのに適した場所です

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)

....

また、python-websocketsを読むこともできます。 https://github.com/mtah/python-websocket

41
rmanna

まず、Socket.IOサーバーの一部がwebsocketをサポートしない理由がわかりません... Socket.IOの意図は、実際のインターフェイスを抽象化することで、Webアプリのフロントエンドブラウザー開発を容易にすることですSocket.IOサーバーによって提供される-timeデータストリーム。おそらくSocket.IOは、アプリケーションに使用すべきものではないでしょうか?それはさておき、あなたの質問に答えてみましょう...

この時点では、Python(gevent-socketioはSocket.IOではありませんclient Pythonのライブラリではありません。 .itはSocket.IO server Pythonのライブラリです。今のところ、さまざまな接続を受け入れながら、クライアントとしてSocket.IOと直接インターフェースするために、元のコードをつなぎ合わせる必要があります。タイプ。

さまざまな接続タイプ(WebSocket、ロングポーリングなど)で機能する万能薬を探していることは知っていますが、このようなライブラリはまだ存在しないため、少なくともいくつかのガイダンスを提供できます私の経験に基づいてWebSocket接続タイプを使用します。

WebSocket接続タイプの場合、PythonでWebSocketクライアントを作成します。コマンドラインからこれをインストールしますPython WebSocketクライアントパッケージ ここ pipを使用して、python

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

完了したら、次を試して、SOCKET_IO_HostおよびSOCKET_IO_PORT 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)

この時点で、Pythonから直接Socket.IOサーバーとインターフェイスする手段があります。 Socket.IOサーバーにメッセージを送信するには、このWebSocket接続を介してメッセージを送信するだけです。 Socket.IOサーバーがPython Socket.IOクライアントからこのWebSocketを介して着信メッセージを適切に解釈するには、Socket.IOプロトコルに準拠し、文字列または辞書をエンコードする必要がありますたとえば、上記のすべてを完了したら、次の手順を実行します。

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

socketIO-client ライブラリは、貢献者の仕事のおかげでイベントコールバックとチャネルをサポートし、MITライセンスの下で PyPI で利用可能です。

コールバックで送信

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)

イベントを定義します。

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)

名前空間でイベントを定義します。

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)

単一のソケットで異なる名前空間を定義します。

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

の SocketTornad.IO 人気のある非同期のライブラリ トルネードWebサーバー Pythonで利用可能なオプションの1つでもあります。

5
Sushant Khurana

1つ書いた: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py 。 Websocketのみをサポートするため、ごくわずかなユーティリティしか使用できない場合があります。

4
Amit Upadhyay

gevent-socketio を見ましたか?

それが役に立てば幸い。

2
Sylvain