我得到了代碼:
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
}
uj5u.com熱心網友回復:
答案是...事件處理。
但首先,讓我們了解什么是事件以及我們為什么需要它們。
Flash Player是一個平臺,它以某種特定的逐幀方式運行其應用程式,無休止地重復相同的回圈:
- 執行腳本(MovieClip的幀腳本以及自前一幀以來發生的所有事件)。
- 渲染顯示串列(包括腳本執行的結果以及按設計逐幀更改的內容,例如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 解釋之類的內容并閱讀所有相關教程。
對于您的套接字,它完全相同。你有幾個可能有效的主機:埠對,你希望你的腳本連接到任何一個可用的,你需要的是停止思考單執行緒并開始思考事件:
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.
}
uj5u.com熱心網友回復:
我在想它應該是這樣的:
if( this.socket.connect != ("127.0.0.1",1000) )
{
this.securityError
}
如果您正在制作一個 AIR 專案(即:誰再為瀏覽器制作 SWF 了??)您可能想要查看Socket命令,其中remotePort和remoteAddress 之類的東西可能對您有用(確保this.socket存在并注意您的this.securityError代碼不會做任何事情,如果連接不正確,您需要拋出錯誤或執行下一步):
if( (this.socket.remoteAddress != "127.0.0.1") && (this.socket.remotePort != 1000) )
{
this.securityError
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/400762.html
標籤:if 语句 actionscript-3 闪光
上一篇:Android:基于迭代佇列的洪水填充演算法“expandToNeighborsWithMap()”函式例外緩慢
下一篇:找不到com.android.tools.build:gradle:7.3.3。在buil.gradle檔案中發現錯誤,請幫幫我
