Actionscript 3 - 检查网络连接

4
我正在我的Flash文件中使用这段代码。
import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;

var monitor:URLMonitor;

function checkInternetConnection(e:Event = null):void
{
var url:URLRequest = new URLRequest("http://www.google.com");
url.method = "HEAD";
monitor = new URLMonitor(url);
monitor.pollInterval = 1000;
//
monitor.addEventListener(StatusEvent.STATUS, checkHTTP);
//
function checkHTTP(e:Event = null):void
{
if (monitor.available) {

       navigateToURL(new URLRequest("flickr.html"),"_top"); 

   } else {

       gotoAndPlay(1);

   }
}
monitor.start();
} 

我正在尝试让Flash检查连接并在没有连接时导航到另一页,否则它将重新播放。
看起来好像不起作用。我有什么遗漏吗?
我已经添加了aircore.swc库路径。
这是一个带有Flash的HTML页面,而不是AIR应用程序。
干杯!
3个回答

7

(我的声望太低,无法直接评论林天真的答案...)

为了使林天真的答案按预期工作,我需要做一些更改:

  • Added:

    urlRequest.useCache = false;
    urlRequest.cacheResponse = false;
    

    This addition was required because even when the connection was definitely lost, the check was still succeeding because the cache was being read from.

  • Changed:

    if( textReceived.indexOf( _contentToCheck ) )
    

    to:

    if( !(textReceived.indexOf( _contentToCheck ) == -1) )
    

    This change was required because while "" (an empty string) was always being found, it was being found at index '0' which was causing the original if() condition to always fail.

  • Added:

    urlRequest.idleTimeout = 10*1000;
    

    In the case where the network cable was physically disconnected from the router, the request could take a very long time to time-out (Honestly, I got tired of waiting after a couple of minutes.)

在进行了上述更改后,我发现天真的代码完美地运行了:无论我如何断开/重新连接Wi-Fi(在iOS和Android设备上),连接状态的变化始终能够被检测到。

嗨,你的代码只适用于安卓设备,我已经在两种设备上测试过了,只有在安卓设备上才能得到结果,在iOS上则一直显示没有网络连接,有什么想法吗? - Elias Rahme

6
我看到你的代码中存在两个问题。一是虽然你有检查网络连接的逻辑(check internet connection),但没有任何调用该函数的代码,因此重定向逻辑不会被调用。二是使用AIRcore.swc可能是一个坏主意,因为你注入了一个可能无法与浏览器沙盒兼容或违反其规则的依赖项。
你可以尝试以下已测试并且不需要AIR SWC的方法:
第一步,按照以下方式包含一个新类ConnectionChecker
package
{
    import flash.events.*;
    import flash.net.*;

    [Event(name="error", type="flash.events.Event")]
    [Event(name="success", type="flash.events.Event")]
    public class ConnectionChecker extends EventDispatcher
    {
        public static const EVENT_SUCCESS:String = "success";
        public static const EVENT_ERROR:String = "error";

        // Though google.com might be an idea, it is generally a better practice
        // to use a url with known content, such as http://foo.com/bar/mytext.txt
        // By doing so, known content can also be verified.

        // This would make the checking more reliable as the wireless hotspot sign-in
        // page would negatively intefere the result.
        private var _urlToCheck:String = "http://www.google.com";


        // empty string so it would always be postive
        private var _contentToCheck:String = "";    

        public function ConnectionChecker()
        {
            super();
        }

        public function check():void
        {
            var urlRequest:URLRequest = new URLRequest(_urlToCheck);
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;

            loader.addEventListener(Event.COMPLETE, loader_complete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, loader_error);

            try
            {
                loader.load(urlRequest);
            }
            catch ( e:Error )
            {
                dispatchErrorEvent();
            }
        }

        private function loader_complete(event:Event):void
        {
            var loader:URLLoader = URLLoader( event.target );
            var textReceived:String = loader.data as String;

            if ( textReceived )
            {
                if ( textReceived.indexOf( _contentToCheck ) )
                {
                    dispatchSuccessEvent();
                }
                else
                {
                    dispatchErrorEvent();
                }
            }
            else
            {
                dispatchErrorEvent();
            }
        }

        private function loader_error(event:IOErrorEvent):void
        {
            dispatchErrorEvent();
        }


        private function dispatchSuccessEvent():void
        {
            dispatchEvent( new Event( EVENT_SUCCESS ) );
        }

        private function dispatchErrorEvent():void
        {
            dispatchEvent( new Event( EVENT_ERROR ) );
        }
    }
}

第二步,在您的主要应用程序或任何需要检查互联网连接的地方,使用以下代码片段:

var checker:ConnectionChecker = new ConnectionChecker();
checker.addEventListener(ConnectionChecker.EVENT_SUCCESS, checker_success);
checker.addEventListener(ConnectionChecker.EVENT_ERROR, checker_error);
checker.check();

private function checker_success(event:Event):void
{
    // There is internet connection
}

private function checker_error(event:Event):void
{
    // There is no internet connection
}

你好,您介意检查一下这个链接吗:http://stackoverflow.com/questions/39849033/flash-cs6-as3-check-internet-connection-not-working-at-all - Elias Rahme
我按照上面答案提到的调整尝试了你的代码,它只在安卓设备上运行,我需要做些什么才能让它在iOS上工作? - Elias Rahme

0

air.net.URLMonitor是AIR可用的类 - 因此在AIR播放器之外不起作用。

但是,您可以尝试自己编写代码,因为所有这些监视器类所做的就是“ping” URL并检查响应,因此您可以尝试从已知源(如google.com)加载某些内容,如果没有错误完成,则表示正常,否则将出现错误。


抱歉,您介意检查一下这个链接吗?http://stackoverflow.com/questions/39849033/flash-cs6-as3-check-internet-connection-not-working-at-all/39860240?noredirect=1#comment67291875_39860240 - Elias Rahme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接