Zurück   Flashforum > Flash und Server > Flash Media Server

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20-04-2010, 11:34   #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);
	}
}
Außerdem soll der Timer für den entsprechenden User beim Disconnecten gestoppt werden, was natürlich auch nicht funktioniert, da es scheinbar im Moment ein Timer für alle ist.

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)
microhome ist offline   Mit Zitat antworten
Alt 20-04-2010, 12:25   #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!
microhome ist offline   Mit Zitat antworten
Alt 20-04-2010, 22:53   #3 (permalink)
aus Berlin
 
Registriert seit: Feb 2002
Ort: Berlin
Beiträge: 516
Ehrlich gesagt verstehe ich überhautpt nicht was du für ein Problem hast ....
ArBr ist offline   Mit Zitat antworten
Alt 21-04-2010, 00:08   #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)
microhome ist offline   Mit Zitat antworten
Alt 21-04-2010, 09:29   #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");
}
Jeder Client hat ein ID

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
ArBr ist offline   Mit Zitat antworten
Alt 21-04-2010, 11:03   #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
Allerdings wird die Verbindung trotzdem geschlossen, bei mehreren Clients sogar die richtige 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
microhome ist offline   Mit Zitat antworten
Alt 21-04-2010, 11:59   #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
ArBr ist offline   Mit Zitat antworten
Alt 21-04-2010, 12:18   #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());
}
Wie komme ich denn an das vom Server erstellte Client Object, also quasi die 2. Verbindung? Beim Application.onDisconnect befindet sich in client ja die Instanz der Verbindung Client -> Server. Nun habe ich aber vom Server aus noch eine neue NC erstellt und muss irgendwie an dieses Client Object kommen, damit ich ein application.disconnect(); darauf ausführen kann, denn dann wird auch automatisch das Intervall gestoppt.


Vielen Dank schonmal für deine Hilfe und sonnige Grüße
microhome ist offline   Mit Zitat antworten
Alt 21-04-2010, 13:17   #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)
ArBr ist offline   Mit Zitat antworten
Alt 21-04-2010, 14:46   #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)
microhome ist offline   Mit Zitat antworten
Alt 21-04-2010, 14:56   #11 (permalink)
aus Berlin
 
Registriert seit: Feb 2002
Ort: Berlin
Beiträge: 516
Zitat:
Zitat von microhome Beitrag anzeigen
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?
Klar geht das.

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)
ArBr ist offline   Mit Zitat antworten
Alt 04-05-2010, 14:58   #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);
}
Der Return von getVars.modus liefert ein undefined, obwohl der Trace in der Funktion selbst den entsprechenden Wert von getVars.modus zurückliefert.

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
microhome ist offline   Mit Zitat antworten
Alt 04-05-2010, 15:28   #13 (permalink)
aus Berlin
 
Registriert seit: Feb 2002
Ort: Berlin
Beiträge: 516
Zitat:
Zitat von microhome Beitrag anzeigen
Der Return von getVars.modus liefert ein undefined
wo denn ??? ich sehe in deinem Quelltext keine Stelle wo du eine Funktion aufrufst und ein Rückgabewert haben willst ?

Geändert von ArBr (04-05-2010 um 15:51 Uhr)
ArBr ist offline   Mit Zitat antworten
Alt 04-05-2010, 16:26   #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.
microhome ist offline   Mit Zitat antworten
Alt 04-05-2010, 16:42   #15 (permalink)
aus Berlin
 
Registriert seit: Feb 2002
Ort: Berlin
Beiträge: 516
Richtig
weil
getMode kein return hat

ArBr ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ä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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele