2017-07-28 1 views
0

EDIT: Aktualisierte Titel wie die Art des Problems mehr klar wurde,Flask.SocketIO schlägt fehl, Daten asynchron registrierte Teilnehmer zu senden, wenn Asynchron-Modus „Einfädeln“

Ich versuche, eine sehr einfache socket.io zu implementieren Verbindung, um Broadcast-Ereignisse von einem Flask-Server an einen Javscript-Client zu senden. Die erste Servernachricht erreicht den Client, aber nicht mehr. Auf der Serverseite ruft es ständig mit periodischen Datenaktualisierungen auf, aber der Client empfängt nach dem ersten keine Nachrichten.

Hier ist der JavaScript-Client (relevante Zeilen aus einem App Reagieren extrahierten):

var io=require('socket.io-client') 
var socket = io.connect(); 
socket.on('connect', function() { 
    console.log('Connection established'); 
}); 


socket.on('message', function(data){ 
    console.log('Message received'); 
    console.log(data); 
    //only gets called for the first message sent by the server 
} 

und der Kolben-Server-Code:

from flask_socketio import SocketIO, emit 
app = Flask(...) 
socketio = SocketIO(app, async_mode="eventlet") 
socketio.emit('message', "Test data", broadcast=True) 

#Update function called periodically with JSON data 
#of the form {"data": {...}} 
def update(data): 
    data = json.dumps(data) 
    socketio.emit('message', data, broadcast=True) 

Der Client die "Testdaten" Nachricht empfängt, aber keine der Nachrichten gesendet von innerhalb der update Funktion.

EDIT: ich diesen Code finden in /usr/lib/python2.7/site-packages/socketio/base_manager.py

for sid in self.get_participants(namespace, room): 
      if sid != skip_sid: 
       if callback is not None: 
        id = self._generate_ack_id(sid, namespace, callback) 
       else: 
        id = None 
       self.server._emit_internal(sid, event, data, namespace, id) 

Im Debugger ich den SID-Wert zu sehen, die die socket.io darstellt Client, wenn der Server die ursprünglichen "Testdaten" sendet und wenn er nachfolgende Aktualisierungen sendet. Daher sieht der Server den Client immer noch als Teilnehmer mit derselben ID, mit der er beginnen musste, und dennoch erhält der Client keine dieser nachfolgenden Aktualisierungen. Wenn ich zwei Nachrichten hintereinander aussende, bevor meine Aktualisierungsfunktion irgendwelche Ereignisse ausgibt, erhält der Client sie. Aber alle Ereignisse innerhalb der Update-Funktion werden vom Client nicht empfangen.

Ich dachte, dies war eine Art von Problem Bereich, aber wenn der Server immer noch den Client als Teilnehmer sieht, wenn Ereignisse innerhalb der Update-Methode ausgegeben werden, scheint es kein Problem Bereich. Ich versuchte auch den Vorschlag in einer Antwort, um das socketio-Objekt an die Update-Funktion zu übergeben, und ich habe das gleiche Verhalten. Ich kann nicht verstehen, warum der Client keine Ereignisse empfangen würde, nur weil der Server sie von einer bestimmten Funktion gesendet hat, wenn der Ausführungskontext dieser Funktion anzeigt, dass der Client noch ein Teilnehmer ist.

Dies ist ungefähr so ​​einfach ein Beispiel, wie ich mir vorstellen kann, und ich mache das gleiche, was ich in jedem Beispiel sehe, das ich online gesehen habe. Offensichtlich vermisse ich etwas.

Antwort

0

Ich denke, Sie sind Verfahren auf Client-Seite erhalten verpasst ... Bitte beachten socket.io

socket.on('test', function (data) { console.log(data); });

+0

Danke, aber ich bin mir nicht sicher, ob ich verstehe, was Sie vorschlagen. Ich habe socket.on ('message', function (data) {...} auf dem Client, wie ich gezeigt habe. Ist das nicht das, was ich brauche, um ein "Nachricht" -Ereignis zu erhalten? Das ist das Ereignis, auf das ich gerade stoße die serverseite.Der Client empfängt es, wenn ich es das erste Mal und nicht die nachfolgenden Zeiten beim Aufruf von der Update-Funktion ausgibt .. – MidnightJava

+0

Sorry, es zu sagen, aber ich bin Socket in NodeJS verwendet .. erhalten Sie socketio in Update-Funktion. Versuchen Sie, Socketio in update funtion als Parameter zu übergeben –

+0

Gute Idee, aber es hat den Trick nicht gemacht. Vielen Dank für Ihre Hilfe. – MidnightJava

0

ich in der Lage war, um es durch das Setzen async_mode auf True funktioniert, wenn ich die SocketIO Instanz auf die erstellen Flask-Server.

Das heißt, änderte ich socketio = SocketIO(app, async_mode="eventlet")-socketio = SocketIO(app, async_mode="threading")

Ich weiß nicht, warum es nicht richtig mit eventlet arbeiten, das die bevorzugte Art zu sein scheint, als Gewinde der letzten ist versucht, wenn Sie nicht angeben es, nach dem Docstring.

Wenn ich genauer die Unterschiede in der Implementierung zwischen threading und den anderen Async-Modi verstehe, könnte ich vielleicht herausfinden, warum es nur funktioniert, wenn ich verwende, was die Dokumente sagen, ist der am wenigsten performante Modus.Vielleicht habe ich es verpasst, aber ich habe in den Dokumenten keine solche Erklärung gesehen, nur eine vage Diskussion über Abhängigkeitsunterschiede zwischen den verschiedenen Modi.

Verwandte Themen