我在Flex / Flashcom应用程序中遇到了一个奇怪的问题。如果客户端应用程序意外断开与服务器的连接,则后者不会调用application.onDisconnect处理函数。我应该看女巫的方向吗?谢谢。
更新我没有使用服务器组件,但我确实在Linux上托管了这个东西。
答案 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 Tokyo对bug on Linux给出了真实答案,并在this thread中有记录。
我的答案是“选择”的唯一原因是因为Artem在7天限制之前没有选择任何其他答案(或他自己的答案),给了我(第一个也是最受欢迎的答案)一半的赏金点数(75以上150)自动,如this SO blog entry中所述。
第一个领导:
如果客户端是基于组件的应用程序,则需要[正确处理连接事件] [9]。
开发应用程序时,请注意使用组件会引入明确的
onConnectAccept
和onConnectReject
事件。您需要包含处理这些事件的代码 使用组件时,必须修改服务器端代码中的
application.onConnect
语句,以包含application.onConnectAccept
和application.onConnectReject
事件处理程序。
您的onConnect
处理程序的最后一行(按执行顺序)应为application.acceptConnection()
或application.rejectConnection()
。如果您的应用程序需要使用显式
acceptConnection()
或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的新版本确实传播了这种异常,因此必须对它们进行监控,然后在客户端应用程序中进行捕获