2008-08-12 16 views
5

Ich habe Probleme beim Verbinden (über die Socket- und XMLSocket-Klassen) mit einem TCP-Listener nach einem Verbindungstimeout.ActionScript 3.0-Sockets können die Verbindung nicht wiederherstellen

Ich habe ein Flash-Applet, das eine TCP-Verbindung zu einem Server aufrechterhalten muss. Ich habe Timeouts mit Timern, einem Ping-Pong-System usw. implementiert. Es gibt jedoch ein Problem. Beim Aufruf von Socket.connect() sendet der Flash-Player (9.0.115 und viele andere Ställe davor) 3 Verbindungsanforderungen über SYN-Pakete mit einer gewissen Zeit dazwischen. Wenn keiner von ihnen geantwortet wird (z. B. weil der Server ausgefallen ist), kann ich das Applet nicht dazu bringen, [Verbindung herzustellen] mit dem Server. Je. Das heißt, innerhalb der Lebensdauer des Applets.

Um zu klären und/oder zusammenfassen:

Für jeden Host/Port-Paar zu Socket.connect gegeben() oder XMLSocket.connect(), wenn der Aufruf fehlschlägt, schließt jeder nachfolgenden() ruft zu jedem anderen Sockel (oder XMLSocket) Instanzen innerhalb der Lebensdauer des Flash-Applet zu dem gleichen Host/Port-Paar werden ignoriert. (So ​​weit ich das mit einem Paket-Sniffer sagen kann.)

Ich habe versucht, zahlreiche Socket-Methoden zu verwenden, die¹ zerstören und die Objekte neu erstellen, einen Pool von Sockets verwenden und verschiedene andere Methoden, an die ich mich jetzt nicht erinnern kann ; alles vergebens.

Meine aktuelle Lösung besteht darin, die übergeordnete Webseite durch einen JavaScript-Aufruf zu benachrichtigen und mein Applet neu laden zu lassen. Es ist keine schöne Lösung, und ich bin nicht im Begriff, Workarounds für die Probleme es Ursachen zu implementieren, nur weil Flash Socket-Verbindungen nicht richtig verarbeiten kann.

Ich muss etwas sehr einfach vermissen.

Irgendwelche Ideen?

1: Ich weiß, dass man Objekte nicht wirklich zerstören kann; Ich entferne einfach alle Referenzen auf sie und hoffe auf das Beste. Ich habe nicht versucht, in diesem Fall den GC explizit aufzurufen. (Obwohl ich glaube, ich versuche, hätte den Sockel innerhalb eines Array setzen und mit löschen.)


Ja, es funktioniert wie erwartet, wenn die Verbindung erfolgreich ist (auch wenn die Verbindung später abfällt.)

Das einzige Ereignis, das dies auslöst, ist der Fall, wenn der Server überhaupt nicht antwortet. Es ist, als ob Flash die Host/Port-Kombination als "offline" markiert und keine weiteren Pakete für die Lebensdauer des Applets sendet.

Ich vermute, eine aktive Verweigerung der Verbindung (z. B. Host ist online, aber nicht auf den Port zu hören) verursacht dies nicht.

Ich bekomme keine Fehlermeldung oder Rückmeldung anderer Art aus dem Socket.

Haben Sie jemals connect() mehr als einmal an dasselbe Host/Port-Paar angerufen, als das erste fehlschlug? Woher wussten Sie, dass die erste connect() fehlgeschlagen ist? Und bevor Sie connect() aufrufen, haben Sie etwas unternommen, um den Socket zurückzusetzen?

+0

Ist die Verbindung erfolgreich, wenn der Server verfügbar ist? Wenn es nach den 3 Malen fehlschlägt, erhalten Sie irgendwelche Fehlermeldungen? Ich habe viel mit Sockets gearbeitet und bin nie auf dieses Problem gestoßen. –

Antwort

3

Dies könnte mit dem ungelösten Fehler FP-269 zusammenhängen, der seinerseits die gleiche Ursache wie FP-67 haben kann.

auf labs.adobe.com

Edwin Wong gefunden im aktuelle öffentliche Beta-Version behoben Dieser Build sollte - [09/23/08 04.49]

würde ich empfehlen geben Sie die latest public beta einen Schuss ...

+0

Danke, ich hatte nie die Fehlerdatenbank von Adobe gefunden. Konnte in der Vergangenheit viele von ihnen eingereicht haben ... – aib

Verwandte Themen