2

主にソケットサーバーにコマンドラインインターフェイスを提供するために、pythonクライアントを接続しようとしているsocket.ioサーバー(node.js内)があります。

私は Python の Web ソケットを使用していますが、これは 4 つの「イベント」しかサポートしていないことに気付きました: オープン時、クローズ時、エラー時、メッセージ時です。

私の socket.io サーバーは、 などのカスタム イベントを定義します.on('connection')。Pythonでそのようなカスタムイベントを発行/受信するにはどうすればよいですか?

これまでの私のスクリプトは、起動して閉じるだけなので、機能しません。import web socket, requests, thread, time host = ' http://socket-url-server.com '

def on_open(ws):
    def run(*args):
        print 'did connect'
        for i in range(3):
            time.sleep(1)
            result =  ws.recv()
            print 'received:'
            print result
        time.sleep(1)
        ws.close()
        print "thread terminating..."
    thread.start_new_thread(run, ())

def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

print('Connecting to %s' % host)

socket = host.replace('http://', 'ws://')
print socket
websocket.enableTrace(True)
_ws = websocket.WebSocketApp(socket,
                             on_message = on_message,
                             on_error = on_error,
                             on_close = on_close)
_ws.on_open = on_open
_ws.run_forever()

それ以外の場合、どのライブラリ/メソッドを使用する必要がありますか? ハンドシェイクを実行して socket.io サーバー キーを自分で取得した場合、その後、どのようにイベントを発行/受信できますか?

https://pypi.python.org/pypi/socketIO-clientも使用してみましたが、そのドキュメントは非常に貧弱です

以下に次のスクリプトを書きましたが、取得するNo handlers could be found for logger "socketIO_client"と永遠にハングします。

from socketIO_client import SocketIO, BaseNamespace

class Namespace(BaseNamespace):

    def on_connect(self):
        print '[Connected]'

socketIO = SocketIO('http://socket-server-url.com', 80, Namespace)
socketIO.wait(seconds=1)
4

1 に答える 1

3

私は同じ質問に出会い、この問題を自分で回避しました。ここで、ライブラリsocketIO_clientの使用に関するコメントをいくつか書きました。

開発環境:サーバー/クライアント:pythonで書いたnodejs/sio_client

  1. "ロガー "socketIO_client" のハンドラーが見つかりませんでした。これは、ログ記録用のハンドラーが必要であることを意味します。" import logging;を試してください。logging.basicConfig(level=logging.DEBUG)」とログに記録されました。
  2. 指定されたサーバーに際限なく再接続し続けるため、「socketio_client は永久にハングします」。つまり、 socketIOオブジェクトが初期化されて戻るまで、 Namespaceオブジェクトは採用されません。socketio オブジェクトを初期化する他のスレッド (thr_siohandle と呼ばれる) があり、メインスレッドは名前空間に含まれるキューを使用して、サーバーからの応答があるかどうかを確認します。sio_client を実行する前に、サーバーに常にアクセスできる必要があるようです。そうしないと、プログラムを停止しない限り、再接続が維持されます。wait_for_connectionを True に設定して停止することもできますが、自分でsocketIO_client.exceptions.ConnectionErrorを処理する必要があります。

ご参考までに

[2014/02/19] py_SIOClient に関する私の回答にコメントを追加さ​​せてください。

次のようなコード例:

class ChatNamespace(BaseNamespace):
    def on_connect( self ):
        print "connected."
    def on_sayhello_response( self, data ):
        print "response:", data 

sio = SocketIO(host, port, ChatNamespace)
chatns = sio.define(ChatNamespace, '/chat')

while (1):
    chatns.emit('sayhello', {'name':'John'})
    chatns.wait(1)

この例のコマンド 'sayhello' は、接続がリセットされると非アクティブになり、Namespace オブジェクトの chatns にアクセスできなくなります (エラーも発生しません)。したがって、接続がいつリセットされるかわからないため、メッセージを発行する前に毎回専用の名前空間を再定義することで回避できます (私の意見では問題ありません)。py_SocketIO_Client で作業している人々に役立つことを願っています。

補足 2014/09/09 node(.js) をバックエンドサーバーとして使っていたので、このライブラリは何ヶ月も更新されていないようで、その socket.io はsocket.io < 1.0.0でしかサポートしていません。このライブラリを選択する前に、パッケージのバージョンを確認してください。私のような同じ問題に直面している人々に役立つことを願っています。

于 2014-02-11T05:12:46.357 に答える