【问题标题】:How to verify this type of variable?如何验证这种类型的变量?
【发布时间】:2021-12-30 17:51:52
【问题描述】:

我得到了代码:

this.socket.connect("127.0.0.1",1000);

如果IP或端口不同,我想执行功能securityError

喜欢如果代码是喜欢的

this.socket.connect("129.124.7.17",1000);

this.socket.connect("127.0.0.1",1236);

或者两者都做不同的功能securityError

我在想它应该看起来像这样:

if(this.socket.connect != ("127.0.0.1",1000))
{
this.securityError
}

【问题讨论】:

    标签: if-statement actionscript-3 flash


    【解决方案1】:

    答案是……事件处理

    但首先,让我们了解一下,什么是事件以及我们为什么需要它们。

    Flash Player 是一个平台,它以特定的逐帧方式运行其应用程序,无休止地重复相同的循环:

    1. 执行脚本(MovieClip的帧脚本以及自上一帧以来发生的所有事件)。
    2. 渲染显示列表(其中包括脚本执行的结果以及通过设计逐帧更改的内容,例如 MovieClip 的时间线)并显示渲染结果。李>

    在脚本执行阶段结束之前,渲染阶段不会开始。如果你放一些无限运行的脚本,渲染阶段根本不会开始:

    while (true)
    {
        // Do nothing.
    }
    

    它与套接字有什么关系?问题是,有些操作(大部分与外部环境有关)不能保证在给定时间内完成(或根本完成):

    • 从本地驱动器加载文件。
    • 通过 HTTP 请求发送和接收数据。
    • (以及)连接到 TCP 套接字,向/从其发送和接收数据。

    如果您在脚本执行阶段尝试等待这些(和其他类似)操作完成,您可能会完全停止您的应用程序。

    那么,你如何避免这样的结局呢?

    答案是:异步操作和事件。什么是异步?与上述主要 Flash Player 循环并行运行的操作。

    您应该以类似多线程的方式进行思考,并将您的 AS3 逻辑组合在一小段代码中,这些代码开始非保证操作并完成脚本以允许渲染阶段发生,而其他代码块在WHEN出现时执行,而这些长时间运行的非保证操作执行它们的操作。重要的是它并不重要,WHEN。我们只是假设它发生在一段时间后

    让我们看一些例子:

    // WARNING: This one snippet is NOT a real AS3 code,
    // just an example of synchronous thinking.
    
    function loadSettings(fileName:String):void
    {
        var aSettings:String = LocalFile.load(fileName);
        
        if (aSettings)
        {
            // The file was loaded successfully, process the loaded data.
        }
        else
        {
            // The file failed to load. React to it.
        }
    }
    

    那么,在AS3中是如何做到的:

    function loadSettings(fileName:String):void
    {
        // Here I let the aLoader be a local function variable,
        // yet keep in mind that you ALWAYS need to store such
        // an object attached to scope in some way. Otherwise
        // the Garbage Collector might just eat it away.
        var aLoader:URLLoader = new URLLoader;
        
        // Subscribe to events of the loading process.
        
        // Successful loading.
        aLoader.addEventListener(Event.COMPLETE, onSettings);
        
        // Error cases.
        aLoader.addEventListener(IOErrorEvent.IO_ERROR, onFailed);
        aLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onFailed);
        
        // Start asynchronous loading process.
        aLoader.load(new URLRequest(fileName));
        
        // The script is done here.
    }
    

    让我们处理这些事件。

    function onSettings(e:Event):void
    {
        // Event ALWAYS has a reference to the object,
        // but you need to typecast it to the appropriate class.
        var aLoader:URLLoader = e.target as URLLoader;
        
        // The file was loaded successfully, process the loaded data.
    }
    
    function onFailed(e:Event):void
    {
        var aLoader:URLLoader = e.target as URLLoader;
        
        // The file failed to load. React to it.
    }
    

    如您所见,这两种情况的逻辑完全相同,但事件处理允许文件加载根据需要花费尽可能多的时间,而不会导致 Flash Player 卡顿。

    我还鼓励您搜索类似 as3 events Explained 的内容并阅读所有相关教程。

    使用您的插座,情况完全相同。您有几个可能有效的 host:port 对,您希望您的脚本连接到任何可用的,您需要停止单线程思考并开始思考 events:

    var aSock:Socket;
    
    var aList:Array = [
        {host:"127.0.0.1", port:1000},
        {host:"127.0.0.1", port:1236},
        {host:"129.124.7.17", port:1000},
    ];
    
    function tryNext():void
    {
        // Create a new socket instance.
        aSock = new Socket;
        
        // Subscribe to possible outcomes.
        aSock.addEventListener(Event.CONNECT, onConnected);
        aSock.addEventListener(IOErrorEvent.IO_ERROR, onFailed);
        aSock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onFailed);
        
        // Try connecting to the next server from the list.
        var aServer:Object = aList[0];
        
        // Start the asynchronous operation.
        aSock.connect(aServer.host, aServer.port);
    }
    
    // Handle the failed-to-connect case.
    function onFailed(e:Event):void
    {
        // Sanity check: ignore the event, if
        // it is not from the current socket object.
        var aSocket:Socket = e.target as Socket;
        if (aSocket != aSock) return;
        
        // Remove the failed server from the list.
        aList.shift();
        
        // Try next server, if there are any left.
        if (aList.length)
        {
            tryNext();
        }
        else
        {
            // None of the given servers responded.
            // Process the case here.
        }
    }
    
    // Handle the failed-to-connect case.
    function onConnected(e:Event):void
    {
        // Sanity check, again.
        var aSocket:Socket = e.target as Socket;
        if (aSocket != aSock) return;
        
        // If we're here, that means everything is fine and the socket aSock
        // is successfully connected to the server with the host:port pair
        // from the aList[0] object. You can start reading and writing
        // data from/to socket from here on.
    }
    

    【讨论】:

    • 如果事情与 127.0.0.1 不同,我不需要兄弟来执行功能,ip 129.124.7.17 只是一个示例。我想如果 ip 或端口不同于 127.0.0.1 和 1000 来执行函数 ScurityError 我已经得到了函数 OnFailed 和函数 OnConnect
    • 我只需要一些东西来验证括号内的内容,如果它是 != 与 "127.0.0.1",100 ,就像它与执行功能 SecurityError 的不同
    • IP 129.124.7.17 不应出现在代码中,它只是一个示例
    【解决方案2】:

    我在想它应该看起来像这样:

    if( this.socket.connect != ("127.0.0.1",1000) )
    {
        this.securityError
    }
    

    如果您正在制作一个 AIR 项目(ie: 谁再为浏览器制作 SWF??)您可能想查看 Socket 命令,其中类似 remotePortremoteAddress 可能对您有用(确保 this.socket 存在并注意您的 this.securityError 代码不会做任何事情,您需要抛出错误或执行下一步(s ) 如果连接不正确):

    if( (this.socket.remoteAddress != "127.0.0.1") && (this.socket.remotePort != 1000) )
    {
       this.securityError
    }
    

    【讨论】:

    • 不适用于 frikin 浏览器
    • 好。所以它是一个 AIR 项目?如果是,请应用我的答案并提供反馈。 PS 我的 "do next steps" 意味着不要担心this.securityError,因为这是一个弹出窗口(如果正确完成),而是继续显示/执行如果值是不正确。除非你真的需要一个安全错误事件来触发,因为也许你有一些监听器在等待这样的事件......??
    • PS: (1) 如果你做了一些function securityError ( ) { ....etc... },你可以像这样运行this.securityError();(2) 你说 “我已经得到了 OnFailed 函数” 所以可能忘记调度安全错误事件并且当端口/地址不正确时,只需运行 this.OnFailed( null ); .您使用null 让它知道不会有Event 数据类型作为函数参数给出。如果您未显示的 onFailed 期望像 function onFailed ( something:Event) { ...code here... } 这样的事件,则使用 null
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2010-10-04
    • 2016-03-27
    相关资源
    最近更新 更多