flask_socketio und die Reihenfolge

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Popkultur
User
Beiträge: 30
Registriert: Donnerstag 20. Oktober 2016, 16:46

Hallo,

ich habe flask_socketio benutzt, um Daten stream-ähnlich zu übertragen. Kann ich irgendwie garantieren, dass die verschiedenen Datenströme in der richtigen Reihenfolge angezeigt werden? Zur Not auch mit Auslassung von Datenblöcken zwecks Geschwindigkeit. :(
BlackJack

@Popkultur: Ich denke bei der Frage fehlt noch ein bisschen Kontext. Websockets sind ja an sich schon mal Datenströme, da gehen keine Daten verloren und die Daten kommen in der Reihenfolge an in der sie abgeschickt werden. Wie sieht denn Deine Architektur aus, dass da irgend etwas durcheinander kommen könnte?
Popkultur
User
Beiträge: 30
Registriert: Donnerstag 20. Oktober 2016, 16:46

Naja, das ganze ist eine letztlich asynchrone Kommunikation zwischen JS und Py:

Codeauszüge:

Code: Alles auswählen

# @socketio.on('connect')
def on_connect(vsnum):
    videosources = get_vs(type="list", vsnum=vsnum)
    c = IpCamera(dict(videosources)[int(vsnum)]['url']); 
    buffer = c.get_frame()
    socketio.emit('sendpic', { 'vsnum': vsnum, 'buffer': buffer, 'status': 0 })
    # eventlet.sleep(0.05)
    return 'ok'
[codebox=javascript file=Unbenannt.js]
$(function() {
var socket = io('http://127.0.0.1:80');
socket.on('connect', function() {
/*$('div.videoframe canvas').each(function() {
socket.emit('connect', { data: this.id.substr(6,3) });
});*/
});
socket.on('sendpic', function(buffer) {
if (buffer) {
var canvas = document.getElementById('frame-' + buffer['vsnum']);
if (canvas != null) {
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = 'data:image/jpeg;base64,' + _arrayBufferToBase64(buffer['buffer']);
ctx.drawImage(img,0,0,img.width,img.height,0,0,640,360);
}
}
});
});
[/code]
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Popkultur: so ganz habe ich noch nicht verstanden, wo Du jetzt ein Problem hast.
Popkultur
User
Beiträge: 30
Registriert: Donnerstag 20. Oktober 2016, 16:46

scheinbar kommen die Daten vom Server beim Client nicht immer in der richtigen Reihenfolge an. :K

Muss ich wohl ne Art Buffer einbauen und durchzählen lassen. Aber das kanns ja wohl nicht sein.
BlackJack

@Popkultur: Wo spielt denn bei dem gezeigten Code die Reihenfolge eine Rolle? Ich verstehe das Problem ehrlich gesagt auch nicht.
Popkultur
User
Beiträge: 30
Registriert: Donnerstag 20. Oktober 2016, 16:46

Auweia, ich habe eine while-Schleife im PY-Code unterschlagen, als ich den Code vereinfacht habe. Pardon!

Hier die Korrektur:
Popkultur hat geschrieben:Naja, das ganze ist eine letztlich asynchrone Kommunikation zwischen JS und Py:

Codeauszüge:

Code: Alles auswählen

# @socketio.on('connect')
def on_connect(vsnum):
    videosources = get_vs(type="list", vsnum=vsnum)
    c = IpCamera(dict(videosources)[int(vsnum)]['url']);
    # while folgt !!!!
    while (c.status == 0) and True:
        buffer = c.get_frame()
        socketio.emit('sendpic', { 'vsnum': vsnum, 'buffer': buffer, 'status': 0 })
        # eventlet.sleep(0.05)
    return 'ok'
[codebox=javascript file=Unbenannt.js]
$(function() {
var socket = io('http://127.0.0.1:80');
socket.on('connect', function() {
/*$('div.videoframe canvas').each(function() {
socket.emit('connect', { data: this.id.substr(6,3) });
});*/
});
socket.on('sendpic', function(buffer) {
if (buffer) {
var canvas = document.getElementById('frame-' + buffer['vsnum']);
if (canvas != null) {
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = 'data:image/jpeg;base64,' + _arrayBufferToBase64(buffer['buffer']);
ctx.drawImage(img,0,0,img.width,img.height,0,0,640,360);
}
}
});
});
[/code]
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Popkultur: die sendpic-Nachrichten kommen in der Reihenfolge an, wie Du sie sendest. Was sollen denn die Klammern und das »and True« bei Deiner while-Schleife?
Antworten