0

フロントエンドとWebソケットサーバー間のリアルタイム通信のために、socket.io.jsアプリケーションを使用してFlaskSocketIOを実装しようとしています

フロントエンドのコードは次のようになります。

 $(document).ready(function() {
        namespace = '/test';
        var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
        socket.on('connect', function() {
            socket.emit('my event', {data: 'Client connected!'});
        });
        socket.on('my response', function(msg) {
            $('#log').append('<br>' + $('<div/>').text('Received #' + msg.count + ': ' + msg.data).html());
        }); });

Flask で使用しているコードは次のとおりです。

@socketio.on('my event', namespace='/test')
def receive__message(message):
    socketio.emit('my response', {'data': 'Backend saw "' + json.dumps(message['data']) + '" from the frontend'})
    print("Received from message data:" + json.dumps(message['data']))

FlaskSocketIO 側ではメッセージを正常に受信できますが、「my respose」メッセージを送信すると、以下のように Google Chrome の [Network] タブ内にメッセージが表示されますが、上記の「my response」の JavaScript コードに従ってアクションは実行されません。 ' イベント:

ÿ42["my response",{"data":"Backend saw \"{\"state\": \"Client Connected \"}\" from the frontend"}]

そうは言っても、フロントエンドとフラスコソケットシオの間の通信は正常に行われますが、コードのこの部分では何も起こりません...

  socket.on('my response', function(msg) {
            $('#log').append('<br>' + $('<div/>').text('Received #' + msg.count + ': ' + msg.data).html());
        });

alert(msg) または console.log(msg) を使用してみましたが、受信したメッセージが表示されても何も表示されません...何が問題なのか手がかりはありますか? Flask が SocketIO JS プラグインの間違った形式でメッセージを生成する可能性がありますか?

4

1 に答える 1

1

サーバーからクライアントにメッセージを送信するには、2 つの方法があります。

機能を使用していsocketio.emit()ます。これは、環境について何も知らない、コンテキストに依存しない関数です。あなたの例では、namespace引数を含めていないため、エミットは名前空間ではなくデフォルトの名前空間でクライアントに送信されます/test。クライアントを追加namespace='/test'すると、メッセージが正常に取得されます。

この場合、より便利な別の方法は、コンテキスト認識emit()機能を使用することです。これは、イベント ハンドラー内からのみ使用できます。この関数は、イベント コンテキストからいくつかの情報を取得します。たとえば、現在処理されているイベントで使用されている名前空間を検出し、デフォルトで同じ名前空間で発行します。それは次のようになります。

from flask_socketio import emit

@socketio.on('my event', namespace='/test')
def receive__message(message):
    emit('my response', {'data': 'Backend saw "' + json.dumps(message['data']) + '" from the frontend'})
    print("Received from message data:" + json.dumps(message['data']))

のコンテキスト対応バージョンとコンテキスト非依存バージョンの重要な違いの 1 つemitは、コンテキスト対応バージョンはデフォルトで元のイベントを送信したクライアントに送信することですが、コンテキスト非依存の発行はデフォルトですべてのクライアントにブロードキャストすることです。コンテキストの知識はありません。

于 2016-08-22T22:17:58.607 に答える