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 保留在那里,用于存档)。

Ric Tokyo就Linux 上的一个错误给出了真正的答案,并记录在此线程中。

我的答案是“选择”的唯一原因是因为 Artem 在 7 天限制之前没有选择任何其他答案(或他自己的答案),给了我(第一个也是最受好评的答案)一半的赏金积分(超过 75 150)自动如此 SO 博客条目中所述。


第一条线索:

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

当您开发应用程序时,请注意使用组件会引入显式onConnectAcceptonConnectReject事件。

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

acceptConnection()如果您的应用程序在显式or方法之后需要额外的代码rejectConnection(),例如指示用户已被授予或拒绝对应用程序的权限的消息,您应该将该代码放在application.onConnectAcceptorapplication.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 确实会传播此类异常,因此必须对其进行监视,然后在客户端应用程序中捕获它们

于 2009-01-28T05:11:14.127 回答