接続タイムアウト後に (Socket および XMLSocket クラスを介して) TCP リスナーに接続できません。
サーバーへの TCP 接続を維持する必要があるフラッシュ アプレットがあります。タイマーやピンポン システムなどを使用してタイムアウトを実装しました。ただし、問題があります。Socket.connect() を呼び出すと、フラッシュ プレーヤー (9.0.115 およびそれ以前の他の多くの安定版) は、SYN パケットを介して 3 つの接続要求を送信します。これらのいずれにも応答がない場合 (サーバーがダウンしているなどの理由で)、アプレットをサーバーに接続 [試行] することはできません。これまで。つまり、アプレットの存続期間内です。
明確化および/または要約するには:
Socket.connect() または XMLSocket.connect() に指定されたホスト/ポートのペアについて、呼び出しが失敗した場合、Flash アプレットの存続期間内の他の Socket (または XMLSocket) インスタンスへの後続の connect() 呼び出しは同じホスト/ポートのペアは無視されます。(少なくとも、パケット スニファを使用してわかる限りでは。)
私は多数の Socket メソッドを呼び出し、破棄¹ してオブジェクトを再作成し、ソケットのプールを使用して、今は思い出せない他のさまざまなメソッドを試しました。すべて役に立たない。
私の現在の解決策は、JavaScript 呼び出しを介して親 Web ページに通知し、アプレットをリロードさせることです。Flash がソケット接続を適切に処理できないという理由だけで、それが引き起こす問題の回避策を実装するつもりはありません。
非常に単純なものが欠けているに違いありません。
何か案は?
1: オブジェクトを実際に破壊できないことはわかっています。それらへの参照をすべて削除し、最善を尽くします。この場合、GC を明示的に呼び出そうとはしていません。(ただし、Socket を Array 内に配置してdeleteを使用しようとしたと思います。)
はい、接続が成功した場合は期待どおりに動作します (後で接続が切断された場合でも)。
これをトリガーする唯一のイベントは、サーバーがまったく応答しない場合です。あたかも Flash がホストとポートの組み合わせを「オフライン」としてマークし、アプレットの存続期間中はそれ以上パケットを送信しないかのようです。
接続の積極的な拒否 (たとえば、ホストはオンラインであるが、ポートをリッスンしていない) が原因ではないのではないかと思います。
Socket からエラー メッセージやその他の種類のフィードバックは得られません。
最初のペアが失敗したときに、同じホスト/ポートのペアに対して connect() を複数回呼び出したことがありますか? 最初の connect() が失敗したことをどうやって知りましたか? 後続の connect() 呼び出しの前に、ソケットをリセットするために何かしましたか?