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.
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
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 –
Gute Idee, aber es hat den Trick nicht gemacht. Vielen Dank für Ihre Hilfe. – MidnightJava