| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
| Stream aus Instanz verteilen
Hallo zusammen, ich möchte serverseitig nach dem Connecten eines Clients zu einem RTMP Live-Stream bestimmte mySQL Operationen ausführen. Hierzu benötige ich allerdings eine eindeutige Zuordnung jedes Clients. Es wird ein Username und ein Passwort beim Verbinden zum Server mitgeschickt, der via mySQL geprüft wird. Nun möchte ich für den entsprechenden User in einem 10 Sekunden Intervall eine DB-Abfrage machen. Das funktioniert bei einem User problemlos. Allerdings ändert sich der Benutzer beim Connecten eines zweiten Clients. Wie kann ich das Problem lösen? Hier mein serverseitiger Code: Code: application.allowDebug = true;
application.onConnect = function(client, user, pass, mode) {
application.acceptConnection(client);
if (mode != "1"){
this.timer_ts = (new Date().valueOf() + 10000);
this.timer_event = setInterval(checkForEvent, 1000, this);
this.user = user;
}
}
application.onDisconnect = function(client){
clearInterval(this.timer_event);
}
function checkForEvent(app){
var now = new Date().valueOf();
if (now > app.timer_ts){
app.timer_ts = (new Date().valueOf() + 10000);
trace("some action " + app.user);
}
else{
trace("waiting " + app.user);
}
} Ich würde mich sehr über eine Idee freuen und wünsche euch noch einen sonnigen Nachmittag! Beste Grüße und Danke schonmal aus Berlin. Geändert von microhome (20-04-2010 um 17:05 Uhr) |
| | |
| | #2 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
|
Das oben genannte Problem habe ich mit Hilfe verschiedener Instanzen gelöst. Jeder Client bekommt jetzt seine eigene Instanz, sodass die MySQL Abfrage im Intervall serverseitig jeweils für den entsprechenden User erfolgen kann. Ein Problem habe ich allerdings noch: Da die Instanzen scheinbar voneinander abgegrenzt sind, kann ich nicht einfach einen Stream aufrufen. Ich benutze einen Broadcaster, der einen Livestream zur Verfügung stellt. Auf diesen Livestream sollen die Receiver zugreifen. Nun ist das bei verschiedenen Instanzen jedoch nicht so einfach möglich. Habt ihr eine Idee??? Besten Dank! |
| | |
| | #4 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
|
Kein Problem, dann will ich es nochmal etwas genauer erklären. Ein Client soll sich auf dem FMS Server (RTMP) einloggen und eine Verbindung zu dem entsprechenden Live-Stream bekommen. Sobald er sich eingeloggt hat, soll ein Intervall gestartet werden, dass für diesen User alle x Sekunden eine bestimmte mySQL Abfrage ausführt. Sobald der Client seine Verbindung trennt, soll auch das Intervall mit den mySQL Abfragen stoppen. Im Moment löse ich den ersten Teil folgendermaßen: Client connected zu bestimmter Instanz und bekommt den Stream. Serverseitig wird eine neue Instanz für diesen User erstellt, die das Intervall beinhaltet. In der main.asc schaut das folgendermaßen aus: Code: application.allowDebug = true;
application.onConnect = function(client, user, pass, modus) {
if (modus == '1'){ // receiver
application.acceptConnection(client);
trace ("user connected: " + client.id + " (" + user + ")");
client_nc = new NetConnection();
client_nc.connect("rtmp://localhost/myapp/"+client.id,user,pass,"3");
}
else if (modus == "2"){ // submitter
application.acceptConnection(client);
trace ("submitter connected");
}
else if (modus == "3"){ // interval instanz
application.acceptConnection(client);
this.timer_event = setInterval(sqlWork, 10000, this);
this.user = user;
this.client_slave = client;
}
else{
application.rejectConnection(client);
trace ("connection rejected");
}
}
function sqlWork(app){
trace("do some mySQL stuff for " + app.user);
trace(app.client_slave.ping());
} Mein Problem ist nun, dass ich die dynamische Instanz disconnecten will, sobald der User die Verbindung schließt. Das ganze wollte ich über die ping() Funktion machen, jedoch weiß ich nicht, wie ich das erste client object in die sqlWork Funktion bekomme. Hast du vielleicht einen Tipp??? Wäre echt klasse, denn ich sitze nun schon den ganzen Tag davor und habe einfache keine Ideen mehr ![]() Besten Dank und gute Nacht erstmal! Geändert von microhome (21-04-2010 um 01:51 Uhr) |
| | |
| | #5 (permalink) |
| aus Berlin Registriert seit: Feb 2002 Ort: Berlin
Beiträge: 516
|
also ... Serverside Actionscript ist gar nicht so schwer wie man denkt ![]() Wenn du mit mehreren Clients arbeitest muss du als erstes ein Object oder Array erstellen wo alle deine Clients verwaltet werden sollen, alternativ gibt es auch application.clients Code: for (i = 0; i < application.clients.length; i++){
application.clients[i].call("Irgndwas");
} Code: application.onConnect(newClient) {
trace(newClient.id);
} also mach am besten sowas Code: var cObj = new Object();
application.onConnect = function(clientObj){
this.acceptConnection(clientObj);
cObj[clientObj.id]=clientObj;
cObj[clientObj.id].client_nc = new NetConnection();
cObj[clientObj.id].client_nc.connect("rtmp:.....");
}
application.onDisconnect = function (clientObj){
cObj[clientObj.id].client_nc.close();
// wird die NC etwa nicht automatisch geschlossen ?
delete cObj[clientObj.id];
} Ich habe das was ich hier geschrieben habe nicht getestet kann sein dass etwas nicht funktioniert |
| | |
| | #6 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
|
Hallo ArBr, vielen Dank für deine Antwort, die ich natürlich direkt versucht habe umzusetzen. Der erste NC (der vom Client ausgeht) wird automatisch geschlossen, genau. Jedoch geht es jetzt darum beim Disconnect auch den vom Server erstellten NC zu schließen. Die Idee mit den Arrays ist super, ich frage mich warum ich da nicht schon selbst drauf gekommen bin. Ich habe deinen o.g. Code direkt versucht zu verarbeiten. Beim Disconnect kommt jetzt folgender Fehler in der vom Server erstellten Instanz: Code: TypeError: cObj[client.id] has no properties Das Intervall läuft dennoch weiter, obwohl sich in der entsprechenden Instanz 0 Clients befinden. Das heißt ich müsste hier auch mit einem Array arbeiten und dann beim onDisconnect ein clearInterval hinzufügen - richtig?Besten Dank schonmal und einen sonnigen Tag |
| | |
| | #7 (permalink) |
| aus Berlin Registriert seit: Feb 2002 Ort: Berlin
Beiträge: 516
|
Also bei mir kommt kein Fehler. Probierst du eventuell etwas zu machen nach dem Instance nicht mehr da ist? Interval kannst du natürlich auch löschen wenn cObj keine Clients mehr hat. Oder .... auch nicht löschen, sondern keine Abfragen starten .... ich weiß ja nicht was du in deiner Anwendung sonst alles noch machst |
| | |
| | #8 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
|
Bisher mache ich nicht viel mehr als oben bereits geschrieben ![]() Code: application.allowDebug = true;
var cObj = new Object();
application.onConnect = function(client, user, pass, modus) {
if (modus == '1'){ // receiver
application.acceptConnection(client);
trace ("user connected: " + client.id + " (" + user + ")");
cObj[client.id] = client;
cObj[client.id].client_nc = new NetConnection();
cObj[client.id].client_nc.connect("rtmp://localhost/myapp/"+client.id,user,pass,"3");
}
else if (modus == "2"){ // submitter
application.acceptConnection(client);
trace ("submitter connected");
}
else if (modus == "3"){ // interval instanz
application.acceptConnection(client);
this.timer_event = setInterval(sqlWork, 10000, this);
this.user = user;
this.client_slave = client;
}
else{
application.rejectConnection(client);
trace ("connection rejected");
}
}
application.onDisconnect = function (client){
cObj[client.id].client_nc.close(); // HIER KOMMT DER FEHLER
}
function sqlWork(app){
trace("do some mySQL stuff for " + app.user);
trace(app.client_slave.ping());
} Vielen Dank schonmal für deine Hilfe und sonnige Grüße |
| | |
| | #9 (permalink) |
| aus Berlin Registriert seit: Feb 2002 Ort: Berlin
Beiträge: 516
|
hast du immer clients "modus == 1" ? und irgendwie kann ich immer noch nich so ganz verstehen was du überhaupt damit vor hast ![]() Ah! jetzt versteh ich ... aber .... warum machst du sowas ???? sonst wenn du mit modus == "3" connectest ist der client bei dir nicht im cObj und beim disconnect kann natürlich nicht cObj[client.id].client_nc.close(); aufgerufen werden Geändert von ArBr (21-04-2010 um 13:27 Uhr) |
| | |
| | #10 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
|
Ich mache das, weil wie gesagt für jeden Client der als "1" connected ein Timer-Event gestartet werden soll. Möglicherweise kann ich das ganze auch anders lösen, indem ich einfach jedem Client einen individuellen Timer (über die Client ID) gebe. Das müsste doch möglich sein, oder? // Edit: Problem wie gerade beschrieben gelöst Code: application.allowDebug = true;
tObj = new Object();
application.onConnect = function(client, user, pass, modus) {
if (modus == '1'){ // receiver
application.acceptConnection(client);
trace ("receiver connected: " + client.id + " (" + user + ")");
tObj[client.id] = setInterval(sqlWork, 10000, user);
}
else if (modus == "2"){ // submitter
application.acceptConnection(client);
trace ("submitter connected");
}
else{
application.rejectConnection(client);
trace ("connection rejected");
}
}
application.onDisconnect = function (client){
clearInterval(tObj[client.id]);
}
function sqlWork(user){
trace("do some mySQL stuff for " + user);
} So scheint es zu funktionieren! Nun kann ich die Applikation endlich weiterentwickeln. Sollte ich weiterhin eine Frage haben, so werde ich mich ganz sicher wieder melden Vielen Dank erstmal an dieser Stelle und eine sonnige und entspannte Restwoche!
Geändert von microhome (21-04-2010 um 14:59 Uhr) |
| | |
| | #11 (permalink) | |
| aus Berlin Registriert seit: Feb 2002 Ort: Berlin
Beiträge: 516
| Zitat:
aber onDisconnect wird ja bei jedem aufgerufen egal was für "modus" du hast Geändert von ArBr (21-04-2010 um 15:04 Uhr) | |
| | |
| | #12 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
| noch ein Funktionsproblem
Hallo, bin nun schon ganz gut weitergekommen und kann auch die Variablen an ein PHP Script zur Verarbeitung in MySQL weitergeben. Allerdings habe ich noch ein Problem mit der Rückgabe von Funktionswerten. Hier der entsprechende Code-Ausschnitt: Code: application.onConnect = function(client, user, pass) {
modus = getMode(user, pass);
trace("beim Connect: " + modus);
}
function getMode(user,pass){
var postVars = new LoadVars();
var getVars = new LoadVars();
postVars.action = 'getmode';
postVars.u = user;
postVars.p = pass;
getVars.onLoad = function() {
trace("von Funktion: " + getVars.modus);
return (getVars.modus);
};
postVars.sendAndLoad("http://localhost/serverside.php", getVars);
} Muss ich hier irgendwelche globalen Dinge beachten, sodass die onConnect Funktion auf diese "normale" Funktion zugreifen kann? Würde mich über eine Antwort freuen, vielen Dank schonmal im Voraus |
| | |
| | #14 (permalink) |
| Neuer User Registriert seit: Aug 2005
Beiträge: 16
|
Hey, danke für deine schnelle Antwort. Den Rückgabewert möchte ich an dieser Stelle bekommen: Code: modus = getMode(user, pass); Muss ich das etwa anders aufrufen? Die Funktion wird ja richtig aufgerufen, denn ich bekomme ja den trace von dieser. Allerdings ist der Rückgabewert durch das return undefined. |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| SWF mit mehreren Dynamischen texten Problem | FMato | Flash Einsteiger | 6 | 26-06-2007 13:58 |
| 2 clients | trinity2k | Spielkonzepte und Spieleprogrammierung | 12 | 13-06-2005 13:20 |
| Problem mit OnEnterFrame und mehreren Frames | Crash32 | ActionScript 1 | 1 | 09-01-2005 20:16 |
| Problem bei Variablen aus mehreren txt Dateien | Hoodoo | Flash MX 2004 | 14 | 06-12-2004 14:20 |
| gotoAndPlay - Problem mit mehreren Ebenen | prex | ActionScript 1 | 1 | 18-08-2004 11:13 |