Seite 1 von 1
flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 00:49
von Popkultur
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.

Re: flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 01:01
von 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?
Re: flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 01:18
von Popkultur
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]
Re: flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 16:06
von Sirius3
@Popkultur: so ganz habe ich noch nicht verstanden, wo Du jetzt ein Problem hast.
Re: flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 17:25
von Popkultur
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.
Re: flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 18:04
von BlackJack
@Popkultur: Wo spielt denn bei dem gezeigten Code die Reihenfolge eine Rolle? Ich verstehe das Problem ehrlich gesagt auch nicht.
Re: flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 18:40
von Popkultur
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]
Re: flask_socketio und die Reihenfolge
Verfasst: Dienstag 1. November 2016, 19:13
von Sirius3
@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?