【问题标题】:NetConnection unhandled NetStatusEventNetConnection 未处理的 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 添加一个事件侦听器。有时我的听众怎么可能打电话?

【问题讨论】:

    标签: actionscript-3 events actionscript red5 netconnection


    【解决方案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 对象将始终引发未处理的异常。它是一个特殊的用例。例如,我封装了所有这些功能并将级别更改为“信息”,然后再重新调度事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      相关资源
      最近更新 更多