我在我的 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 保留在那里,用于存档)。
Ric Tokyo就Linux 上的一个错误给出了真正的答案,并记录在此线程中。
我的答案是“选择”的唯一原因是因为 Artem 在 7 天限制之前没有选择任何其他答案(或他自己的答案),给了我(第一个也是最受好评的答案)一半的赏金积分(超过 75 150)自动如此 SO 博客条目中所述。
第一条线索:
如果客户端是基于组件的应用程序,它需要[正确处理连接事件][9]。
当您开发应用程序时,请注意使用组件会引入显式
onConnectAccept
和onConnectReject
事件。
您需要包含处理这些事件的代码。
使用组件时,必须修改application.onConnect
服务器端代码中的语句以包含事件处理程序application.onConnectAccept
和application.onConnectReject
事件处理程序。
处理程序的最后一行(按执行顺序)onConnect
应该是application.acceptConnection()
或application.rejectConnection()
。
acceptConnection()
如果您的应用程序在显式or方法之后需要额外的代码rejectConnection()
,例如指示用户已被授予或拒绝对应用程序的权限的消息,您应该将该代码放在application.onConnectAccept
orapplication.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 确实会传播此类异常,因此必须对其进行监视,然后在客户端应用程序中捕获它们