为什么Flash Media Server不调用application.onDisconnect处理程序?

时间:2008-12-11 15:33:19

标签: flex flash flash-media-server

我在Flex / Flashcom应用程序中遇到了一个奇怪的问题。如果客户端应用程序意外断开与服务器的连接,则后者不会调用application.onDisconnect处理函数。我应该看女巫的方向吗?谢谢。

更新我没有使用服务器组件,但我确实在Linux上托管了这个东西。

3 个答案:

答案 0 :(得分:14)

如果是这样的话,它会被记录下来并且here是一个有趣的论坛...基本上在Linux上它可能有点疯狂,如:)

答案 1 :(得分: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”行为。

答案 2 :(得分:3)

正如Artem Tikhomirov(问题的作者)在他的own answer中提到的,我的答案没有帮助(我将其保存在下面作为wiki,用于存档)。

Ric Tokyobug on Linux给出了真实答案,并在this thread中有记录。

我的答案是“选择”的唯一原因是因为Artem在7天限制之前没有选择任何其他答案(或他自己的答案),给了我(第一个也是最受欢迎的答案)一半的赏金点数(75以上150)自动,如this SO blog entry中所述。


第一个领导:

如果客户端是基于组件的应用程序,则需要[正确处理连接事件] [9]。

  

开发应用程序时,请注意使用组件会引入明确的onConnectAcceptonConnectReject事件。

     

您需要包含处理这些事件的代码   使用组件时,必须修改服务器端代码中的application.onConnect语句,以包含application.onConnectAcceptapplication.onConnectReject事件处理程序。
  您的onConnect处理程序的最后一行(按执行顺序)应为application.acceptConnection()application.rejectConnection()

     

如果您的应用程序需要使用显式acceptConnection()rejectConnection()方法之后的其他代码,例如指示用户已被授予或拒绝该应用程序的权限的消息,则应将该代码放入application.onConnectAcceptapplication.onConnectReject语句。

     

提示:如果您不使用媒体组件,则无法使用application.onConnectAcceptapplication.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的新版本确实传播了这种异常,因此必须对它们进行监控,然后在客户端应用程序中进行捕获