1

Flex/Flashcom アプリケーションで奇妙な問題が発生しました。クライアント アプリケーションが予期せずサーバーから切断された場合、後者は application.onDisconnect ハンドラ関数を呼び出しません。魔女の方向を見るべきですか?ありがとうございました。

更新サーバー コンポーネントは使用していませんが、Linux でホストしています。

4

3 に答える 3

14

もしそうなら、それは文書化されており、ここにフォローする興味深いフォーラムがあります..基本的にLinuxでは、次のように少しクレイジーに動作する可能性があります:)

于 2009-01-28T05:17:52.490 に答える
4

(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 の欠落」動作をトリガーしてテストできます。

于 2009-02-01T23:26:42.643 に答える
3

Artem Tikhomirov (質問の作成者) が彼自身の回答で述べたように、私の回答は役に立ちません (アーカイブ用に wiki として以下に保持します)。

本当の答えは、Linux のバグに関してRic Tokyoによって与えられており、このスレッドに文書化されています。

私の答えが「選ばれた」唯一の理由は、Artem が 7 日間の制限の前に他の答え (または彼自身の答え) を選択しなかったためです。 150)で説明されているように、自動的にこの SO ブログ エントリ.


最初のリード:

クライアントがコンポーネント ベースのアプリケーションである場合、[接続イベントを適切に処理する][9]必要があります。

アプリケーションを開発するときは、コンポーネントを使用すると明示的なイベントが発生することに注意してonConnectAcceptくださいonConnectReject

これらのイベントを処理するコードを含める必要があります。
コンポーネントを使用する場合はapplication.onConnect、サーバー側コードのステートメントを変更して、application.onConnectAcceptおよびapplication.onConnectRejectイベント ハンドラーを含める必要があります。ハンドラー
の最後の行 (実行順) は、または のいずれかである必要があります。onConnectapplication.acceptConnection()application.rejectConnection()

ユーザーがアプリケーションへのアクセス許可を付与または拒否されたことを示すメッセージなど、アプリケーションで明示的なacceptConnection()orメソッドの後に追加のコードが必要な場合は、そのコードをorステートメントに配置する必要があります。rejectConnection()application.onConnectAcceptapplication.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()

これは、サーバー例外がクライアントによって考慮されていないことを示し、予期しない終了を強制します。

クライアントがサーバーからストリームを読み取る場合、次のことを確認する必要があります。

  • NetConnection が成功しました
  • NetStreams (インとアウト) は NET_STATUS をリッスンします

良いコードは次のようになります:

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 はこの種の例外を伝播するため、監視してからクライアント アプリケーションでキャッチする必要があります。

于 2009-01-28T05:11:14.127 に答える