NetConnection 未处理的 NetStatusEvent

Posted

技术标签:

【中文标题】NetConnection 未处理的 NetStatusEvent【英文标题】:NetConnection unhandled NetStatusEvent 【发布时间】:2013-07-10 16:13:47 【问题描述】:

当我使用NetConnection 连接到 Red5 服务器时,有时我会得到一个未经处理的 NetStatusEvent

Error #2044: Unhandled NetStatusEvent:. level=error, code=NetConnection.Call.Failed

这就是我连接的方式(唯一调用NetConnection.connect()的地方):

public function Connect(callBack:Function = null):void 

    if (IsConnected())
    
        if (callBack != null) 
        
            callBack.call();
        
    
    else // Not connected
    
        netConnect.addEventListener(NetStatusEvent.NET_STATUS, function(e:NetStatusEvent):void
        
            // OnConnect called whenever there is a net status event
            OnConnect(e, callBack);
            netConnect.removeEventListener(NetStatusEvent.NET_STATUS, arguments.callee);
        );

        try
        
            // Attempt to connect to Media Server
            netConnect.connect(MEDIA_SERVER_URI, true);
        
        catch(error:Error)
        
            logger.LogError("NetConnection.connect threw an exception.", error);
        
    

我正在为NetStatusEvent.NET_STATUS 添加一个事件侦听器。有时我的听众怎么可能打电话?

【问题讨论】:

【参考方案1】:

您正在删除 NetStatusEvent 处理程序中的侦听器。您应该保留它,直到连接关闭。这就是为什么NetStatusEvent 在其监听器被移除之前只被处理一次。第一个事件以外的任何事件都会引发该错误。

所以删除netConnect.removeEventListener(NetStatusEvent.NET_STATUS, arguments.callee);

NetConnection 会根据发生的情况多次调度该事件。您必须处理事件,直到每次。有关info 属性的可能值列表,请访问此Link。还有一个小例子说明如何处理页面末尾的事件。

【讨论】:

所以在一个 NetConnection.connect() 调用期间可以触发多个 NET_STATUS 事件? connect() 调用会触发 1 个事件,其中包含一组可能的 info 属性,但即使在连接之后,您的 NetConnection 对象也可以为 AppShutdownClose、@ 触发 NET_STATUS 事件987654333@ 或其他一些与连接有关的东西。因此,在关闭 NetConnection 之前,您绝对应该让听众保持原样。 好的,谢谢!我上面的Connect() 函数可能会定期调用。如果我取出removeEventListener,它将开始触发多个匿名函数。我也无法在构造函数中处理此事件,因为我需要将回调传递给Connect()。有什么建议吗? 我想你已经通过检查你的isConnected() 方法来处理这个问题,但我不知道你为什么不使用NetConnection 类的connected 属性来代替.您可以做的另一件事是在addEventListener 之前添加removeEventListener 并命名您的匿名函数(使其可从外部移除)。请注意,即使您的 NetConnection 对象没有侦听器,removeEventListener 也不会引发错误。 连接会定期断开,因此 IsConnected() 检查不会阻止将多个匿名函数添加到侦听器。我可以在添加之前尝试删除。否则,我可以保留上面的代码,但在构造函数中包含第二个侦听器以获取跨越 NET_STATUS 事件。这基本上不会做任何事情(可能只是一个日志条目)。感谢您的回复【参考方案2】:

如果您的客户端不处理 onBWCheck 或 onBWDone 方法,您可能会看到这一点。如果您打开了带宽检测,也会发生这种情况;通过更改 red5.properties 文件中的此参数在服务器上关闭它并重新启动服务器。

rtmp.bandwidth_detection=false

【讨论】:

感谢您的回答。我们使用的是 Red5 0.9.1(对不起,我应该在我的问题中指定)。我相信带宽检测仅从版本 1 开始? 0.9的情况下,你可能只需要加上onBWDone【参考方案3】:

块引用

只是一个额外的信息。使用 info.level = "error" 调度 NetStatusEvent 对象将始终引发未处理的异常。它是一个特殊的用例。例如,我封装了所有这些功能并将级别更改为“信息”,然后再重新调度事件。

【讨论】:

以上是关于NetConnection 未处理的 NetStatusEvent的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有事件侦听器或引用的封闭 NetConnection 会留在内存中?

ActionScript 3:Socket、amf、NetConnection、rtmp……越来越清楚

Actionscript 4:NetConnection.connect(...) 不会触发 NetStatusEvent 事件

ActionScript 3 Flash NetConnection

如何通过 Java 解码从 NetConnection.call(methodName, responder, parameter) 发送的消息

如何通过 http 隧道 Red5 而不会出现 NetConnection.Connect.Closed 错误?