2016-08-22 4 views
0

Ich versuche, eine FlaskSocketIO mit socket.io.js Anwendung für Echtzeit-Kommunikation zwischen Frontend und meinem Web-Socket-ServerSocketIO Empfang Nachricht nicht in JS

Der Frontend-Code so aussieht umzusetzen:

$(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()); 
     }); }); 

der Code, den ich in Flask bin mit ist:

@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'])) 

auf der FlaskSocketIO Seite ich die Nachricht erfolgreich empfangen kann, aber wenn ich die 'meine respose Botschaft aussenden kann ich sehen, th e Meldung wie unten in dem Registerkarte Netzwerk von Google Chrome aufgeführt, aber keine Aktion nach meinem Javascript-Code genommen oben für ‚meine Antwort‘ Ereignis:

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

gesagt hat, dass die Kommunikation zwischen Frontend und flasksocketsio erfolgreich gemacht aber es passiert nichts auf diesem Teil des Codes ...

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

ich habe versucht, mit alert (msg) oder sogar console.log (msg), aber sie zeigen mir nichts selbst sehe ich die Nachricht erhalten haben. .. Irgendwelche Hinweise, was könnte falsch sein? Vielleicht generieren Flask die Nachricht in einem falschen Format für das SocketIO JS Plugin?

Antwort

1

Es gibt zwei Möglichkeiten, Nachrichten vom Server an den Client zu senden.

Sie verwenden die socketio.emit() Funktion. Dies ist eine kontextunabhängige Funktion, die nichts über die Umgebung weiß. In Ihrem Beispiel haben Sie das Argument namespace nicht eingeschlossen, sodass die Ausgabe an den Client im Standardnamespace anstatt an Ihren /test-Namespace gesendet wird. Wenn Sie namespace='/test' hinzufügen, erhält Ihr Client die Nachricht einwandfrei.

Eine Alternative, die in diesem Fall praktischer ist, ist die kontextsensitive emit()-Funktion. Dies kann nur innerhalb eines Event-Handlers verwendet werden. Diese Funktion ruft einige Informationen aus dem Ereigniskontext ab, z. B. erkennt sie, welcher Namespace in dem aktuell behandelten Ereignis verwendet wurde, und sendet standardmäßig im selben Namespace. Das wäre so etwas wie dieses:

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'])) 

Ein wichtiger Unterschied zwischen der kontextsensitiven und kontextunabhängigen Versionen von emit ist, dass die kontextsensitive Version zu emittieren zurück an den Client wird standardmäßig, die das Ursprungsereignis gesendet, während die kontextunabhängige Emission standardmäßig auf alle Clients sendet, da sie keine Kenntnis vom Kontext hat.

+0

Arbeiten wie ein Charme! Danke vielmals! – Mastermind

Verwandte Themen