2009-06-28 12 views
0

In meiner Anwendung verbinden das Browserfenster mit langen Abruf (Comet) mit dem Server. Wenn der Benutzer mehrere Browserregisterkarten öffnet, kommuniziert nur einer von ihnen (der Master) mit dem Server und dient als Proxy für die anderen Registerkarten. Ich möchte flash localConnection verwenden, um Daten zwischen den Registerkarten auszutauschen.Überwachen Sie Browser-Registerkarten mit localConnection und spüren Sie, wenn ein Benutzer eine Registerkarte schließt

Was passiert, wenn ein Benutzer den Master-Tab schließt, der die Komet-Sitzung enthält? Ich kann JavaScript mit dem Unload-Ereignis verwenden, um die anderen Registerkarten zu informieren, dass die Registerkarte "Master" geschlossen wird, und dann die LocalConnection schließen, aber das Unload-Ereignis ist unzuverlässig. Ich kann die Abfrage verwenden, um das Verbindungsobjekt des Master-Tabs zu überwachen, aber es klingt schmutzig.

Wenn der Master geschlossen ist, muss einer der anderen Tabs zum Master werden. Wie stelle ich sicher, dass nur einer von ihnen versucht, der Master zu werden?

Wenn ein Benutzer die Registerkarte schließt, ohne dass Flash die localConnection schließen kann, verursacht einen Speicherverlust?

Danke

Antwort

0

Dies ist ein sehr interessantes Problem. Ich bin halb versucht, etwas zu programmieren, um zu sehen, wie es funktionieren würde! (Wenn ich nur Zeit hätte!)

Erstens, wie für localConnection verursacht ein Leck, ich denke, dass Sie wirklich das testen müssen, aber ich denke, es ist möglich, aber ich habe ein gutes Stück mit LocalConnection in ähnlichen Situationen getan und haben noch nie ein signifikantes Speicherleck gesehen (was auch bedeutet, dass ein Speicherleck und was nur der GC langsam ist, immer schwer in nicht-trivialem Code in Flash zu finden ist)

Wie für die größeren Frage, wie man dieses Ding baut, kann ich keine definitive Antwort geben, aber hier sind ein paar Ideen.

Es scheint mir der Fluss der Logik für jede SWF, so etwas zu gehen hat:

  • prüfen, um zu sehen, ob ich die erste bin (auf den Steuerkanal verbinden)
  • Wenn ja , starten Sie den Kontrollkanal und sagen Sie JS, die Kometenverbindung über ExternalInterface
  • zu starten. Falls nicht, verbinden Sie sich mit dem Kontrollkanal und fordern Sie eine bidirektionale Verbindung an (zu diesem Zeitpunkt würde jede Slave-SWF eine zufällige ID generieren und diese an den Master senden - diese ID würde als der LC-Name für die Daten verwendet, die vom Master zum Slave kommen)

Für die Behandlung der Selbstheilung Aspekt könnte ich etwas tun, wie ein Kettenbrief. Das heißt, wenn jede SWF eine Verbindung zum Master herstellt, könnte sie eine Liste der Slaves empfangen. Wenn die Verbindung jemals beendet wird, würde jeder Client nachsehen, wo er auf der Liste war. Wenn es der erste Slave auf der Liste wäre, würde es als Master übernehmen - starte den Kontrollkanal neu und sag JS, dass er eine neue Kometenverbindung starten soll. Dann würde jeder andere Slave sehen, dass der Server zurück war und den jetzigen Master von seiner Kette entfernen würde.

Um Löcher in der Kette von verschiedenen Clients abzufangen, würde der Master das koordinieren. Da es Daten an die Slaves senden würde, würde es sofort sehen, wenn ein Client abfiel. Wenn ein Client abbrach, würde er den Rest der Clients einfach darauf hinweisen, diesen Client aus seiner Kette zu entfernen.

Hoffe, das hilft!

0

Ich dachte auch an eine ähnliche Strategie.

Das erste Fenster wird zum Master. Zusätzliche Fenster werden zu Sklaven und erzählen dem Meister von ihrer Existenz. Jeder Slave fragt den Master alle 100 ms ab, um sicherzustellen, dass er aktiv ist. Wenn der Master nicht aktiv ist, wird der nächste Slave in der Liste zum Master. Slaves, die als nächste in der Liste sind, bleiben Slave, erwarten aber, dass der erste Slave der Master ist. So in den nächsten 100 ms der Rest der Sklaven werden versuchen, den nächsten Master abzufragen und wenn er nicht da der nächste ist, wird der Meister werden ...

Es ist so schmutzig fühlt, dass ich denke, ich werde haben jetzt duschen. Gehen Sie etwas Codierung zu tun.

Dank

+0

Nun, wenn Sie bereits Comet Daten zu streamen, warum müssen Sie ein Herzschlagsignal tun? Wenn ein Kunde die Daten, die er erwartet, nicht erwartet, wenn er es erwartet, wissen Sie "der König ist tot" und beginnen Sie, die Liste der Nachfolger herunter zu gehen. Wirklich, Comet ist schon mehr als ein bisschen dreckig. Dies ist eigentlich eine ziemlich saubere Lösung für die Behandlung des Problems - und es würde wahrscheinlich am Ende in ähnlicher Weise arbeiten, wenn Sie eine tatsächliche Socket-Verbindung tun würde. –

1

Sehen als Localconnection-Kennung Zeichenketten verwendet Entdeckung zu handhaben, sollte die folgende Lösung arbeiten:

Wenn die Master-Register schließt, ist es eines der Sklaven darüber informiert, dass es so tut. Dann schließt es seine LocalConnection. Der Slave kann nun eine neue LocalConnection mit dem gleichen Namen wie der Master registrieren. Das Ergebnis davon ist, dass beim nächsten Versuch eines der anderen Slaves, den alten Master zu kontaktieren (unter Verwendung der alten Zeichenfolge), sie automatisch mit dem "neuen" Master sprechen werden.

Ein ähnlicher Effekt könnte erreicht werden, ohne auf das Entladeereignis zurückzugreifen (wenn dies nicht erwünscht ist). Wenn der Benutzer die Registerkarte "Master" schließt, erhält jede Anwendung, die versucht, eine Verbindung mit der von ihr verwendeten LocalConnection herzustellen, eine Ausnahme. Anstatt einen Fehler zu liefern, könnte die Slave-App stattdessen folgern, dass diese Ausnahme bedeutet, dass der Master geschlossen wurde. Er würde dann die Master-Rolle übernehmen und eine neue LocalConnection mit demselben Namen wie der Master registrieren. Der Rest folgt wie oben.

Verwandte Themen