Flex/Flashcom アプリケーションで奇妙な問題が発生しました。クライアント アプリケーションが予期せずサーバーから切断された場合、後者は application.onDisconnect ハンドラ関数を呼び出しません。魔女の方向を見るべきですか?ありがとうございました。
更新サーバー コンポーネントは使用していませんが、Linux でホストしています。
Flex/Flashcom アプリケーションで奇妙な問題が発生しました。クライアント アプリケーションが予期せずサーバーから切断された場合、後者は application.onDisconnect ハンドラ関数を呼び出しません。魔女の方向を見るべきですか?ありがとうございました。
更新サーバー コンポーネントは使用していませんが、Linux でホストしています。
もしそうなら、それは文書化されており、ここにフォローする興味深いフォーラムがあります..基本的にLinuxでは、次のように少しクレイジーに動作する可能性があります:)
(Flash Media-) サーバーがこれを「認識する」前に、クライアントが切断される可能性があります。したがって、「onDisconnect」関数は非常に遅くなるまで呼び出されません (クライアントによって呼び出されることはありません)。
「長引く」切断を早期に検出 (および対応) したい場合は、client.getStats() メソッドを使用します。
このサーバー側のアクションスクリプトの例があります:
// add method to standard class
Client.prototype.isAlive = function() {
var stats = this.getStats();
var timeout_value = 3 * 1000; // in ms.
//trace('Measured timeout: ' + stats['ping_rtt']);
if (stats)
return (stats['ping_rtt'] < timeout_value);
}
// use this in an interval which traverses the application.clients list
if (! client.isAlive())
application.disconnect(client);
接続されている Flash クライアントからネットワーク ケーブルを取り外すことで、この「onDisconnect の欠落」動作をトリガーしてテストできます。
Artem Tikhomirov (質問の作成者) が彼自身の回答で述べたように、私の回答は役に立ちません (アーカイブ用に wiki として以下に保持します)。
本当の答えは、Linux のバグに関してRic Tokyoによって与えられており、このスレッドに文書化されています。
私の答えが「選ばれた」唯一の理由は、Artem が 7 日間の制限の前に他の答え (または彼自身の答え) を選択しなかったためです。 150)で説明されているように、自動的にこの SO ブログ エントリ.
最初のリード:
クライアントがコンポーネント ベースのアプリケーションである場合、[接続イベントを適切に処理する][9]必要があります。
アプリケーションを開発するときは、コンポーネントを使用すると明示的なイベントが発生することに注意して
onConnectAccept
くださいonConnectReject
。
これらのイベントを処理するコードを含める必要があります。
コンポーネントを使用する場合はapplication.onConnect
、サーバー側コードのステートメントを変更して、application.onConnectAccept
およびapplication.onConnectReject
イベント ハンドラーを含める必要があります。ハンドラー
の最後の行 (実行順) は、または のいずれかである必要があります。onConnect
application.acceptConnection()
application.rejectConnection()
ユーザーがアプリケーションへのアクセス許可を付与または拒否されたことを示すメッセージなど、アプリケーションで明示的な
acceptConnection()
orメソッドの後に追加のコードが必要な場合は、そのコードをorステートメントに配置する必要があります。rejectConnection()
application.onConnectAccept
application.onConnectReject
application.onConnectAccept
ヒント: メディア コンポーネントを使用していない場合は、とを使用できませんapplication.onConnectReject
。
次に、Flash 出力パネルで次のようなエラー メッセージを確認することをお勧めします。
Error #2044: NetStatusEvent non pris en charge : level=error, code=NetStream.Play.Failed
at MethodInfo-1()
Error #2044: NetStatusEvent non pris en charge : level=error, code=NetStream.Record.NoAccess
at MethodInfo-1()
これは、サーバー例外がクライアントによって考慮されていないことを示し、予期しない終了を強制します。
クライアントがサーバーからストリームを読み取る場合、次のことを確認する必要があります。
良いコードは次のようになります:
var status:Function = function( e:NetStatusEvent ):void
{
trace( "status : " + e.info.code ) ;
if ( e.info.code == "NetConnection.Connect.Success" )
{
streamOut = new NetStream( nc ) ;
streamOut.addEventListener( NetStatusEvent.NET_STATUS , status ) ;
streamIn = new NetStream( nc ) ;
streamIn.addEventListener( NetStatusEvent.NET_STATUS , status ) ;
streamOut.attachCamera( cam ) ;
video.attachNetStream( streamIn ) ;
streamOut.publish( "private" ) ;
streamIn.play( "private" ) ;
}
}
新しいバージョンの FlashPlayer はこの種の例外を伝播するため、監視してからクライアント アプリケーションでキャッチする必要があります。