国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 辦公 > Flash > 正文

Flash AS3教程:ApplySocket類

2020-07-17 13:17:40
字體:
來源:轉載
供稿:網友
前面學習了Flash AS3教程:運算符,今天學習的ApplySocket類,這個類是對socket應用就行了系統化封裝,并且考慮了很多因素,整合出來的一套,較為完善的flash程序部分socket解決方案
比如:一些socket服務端,不一定你send過去一條,他馬上就會轉發,可能會有延時,或者數據堆在一起等現象,而有寫socket服務端,在發送數據的時候,會有一些附加碼等,這樣不利于取出真實數據
該類除了普通的用法,就是對上述假設情況整合了一套解決方案,雖不是很完善,但是能解決大部分問題,至少我碰到過的問題,用這個類應該可以輕松搞定,并且可以適合更復雜的

另外光看講解,可能不大懂,提供了什么解決方案,來解決上面這些問題,因此,麻煩大家賴著性子,先過一到代碼,然后在看后面的用法

index.base.net.ApplySocket類:
對socket進行封裝,并且提供多種socket解決方案

構造函數:
public function ApplySocket(_isSide:Boolean = false,_datatype:String = "String")
第一參數,是否使用包邊,對數據進行處理,詳細請看isSide屬性
第二參數,默認數據發布類型
如果構造函數中兩個參數都是用默認值,則該類只是一個普普通通的socket類

connect方法:
public function connect(_host:String,_port:int):void
連接遠程socket服務端
第一參數:主機地址,可以是202.89.***.***,或者www.*****.com這樣的
第二參數:連接的端口號

send方法:
public function send(...strs):void
發送數據到socket服務端
如果datatype為Object或者ArrayObject的時候,send方法傳入的參數必須大于或者等于兩個!否則會引發錯誤!

close方法:
public function close():void
關閉與遠程服務端連接

connect事件:
當連接上了之后,會調度該事件

close事件:
當socket關閉后,會調度該事件

sync事件:
當有數據需要同步的時候,會調度該事件

error事件:
當連接失敗的時候,會調度該事件

靜態常量:
public static const ARRAY:String = "Array";
public static const STRING:String = "String";
public static const OBJECT:String = "Object";
public static const ARRAY_ARRAY:String = "ArrayArray";
public static const ARRAY_OBJECT:String = "ArrayObject";
分別表示datatype的5種類型

host屬性:
public var host:String;
當connect后,會自動把主機地址記錄到該值上

port屬性:
public var port:int;
當connect后,會自動把連接端口號記錄到該值上

space屬性:
public var space:String = " ";
當send傳入2個或者2個以上參數時,采用何種值進行隔開,默認是 空格,如果將值改為"",則表示不用間隔進行隔開

ls屬性:
public var ls:String = "{";
當isSide為true的時候,放在左邊所使用的記號

rs屬性:
public var rs:String = "}";
當isSide為true的時候,放在右邊所使用的記號

connected屬性:
public var connected:Boolean;
返回socket是否已連接上

isSide屬性:
public var isSide:Boolean;
是否加上包邊處理
如果該值為true,則表示,send傳入的參數都將會用rs和ls包起來進行傳輸到socket端,當socket原版返回數據的時候,在使用正則將真正的數據取出來,并且以datatype類型返回
反之,則不做任何處理。

datatype屬性:
public var datatype:String;
發布同步事件的時候,data采用何種類型返回
String:以字符串返回,就是說傳入什么返回什么

Array:以數組返回,選擇使用Array返回的時候,isSide值必須為true,否則無法斷點找出數組,原理就是,通過使用ls rs兩個符號包起來,然后使用正則把符號中的數據提取出來,并且返回數組。如果,socket服務端,可能還會拋出其他數據給客戶端,那么采用isSide包邊處理,則socket回傳的數據,該類會自動處理,將send出去的數據原本拿下來,回傳數據不受影響

Object:以Object返回,如果send過去的數據,都是以一個變量名一個參數值來傳輸的,那么可以采用Object來接收數據,這樣的話,返回data中,直接返回send進去的第一個參數,即可獲得值(該類型不常用,一般只在特殊情況使用)

ArrayArray:以數組嵌套數組的形式返回數據,如果socket的執行效率不是很高,或者同步要求不是很高,那么客戶端send一次,未必會接收到同步事件,可能會堆積在一起,一起發送到客戶端,這個時候,就可以采用ArrayArray的形式,那么該類會幫你把send過去的數據,重新劃分,并且以一個數組為一個send數據的形式返回,很利于做連連看,對對碰類似同步不是很即時,很多個動作可以堆積到一起來發送

ArrayObject:以數組嵌套Object的形式返回數據,不過多說,只不過是Array加上Object的符合模式而已(該類型也不常用)

Object與ArrayObject,很適合用在群聊天室,比如send("sunbright","大家好{哈 哈}");那么即時你在說話的內容加了很多怪怪符號,比如加上分隔符,空格等等,因為Object的解析原理是,拿出第一個參數做為引用變量名,然后把后面的所有數據賦值給這個引用變量名來返回,所有后面的數據不管怎么樣,都是不會破壞數據內容,即得到data數據后只要返回data的sunbright值,即可得到說話內容,不會因為格式錯誤,而把說話的內容有所改變

該類的作用在datatype屬性中,講了很多東西
下面講講應用:
該類的關鍵就在于isSide和datatype兩個值,
如果isSide為true,那么就等于啟用了數據包邊處理,那么當你調用send方法傳入某些參數,只要socket方做到的是,傳進去什么他返回給你什么,那么通過同步事件,又會自動把處理過的數據,拿出來,做到數據的準確性,不會因為傳了很多參數,有時候會紊亂。

而當datatype的屬性改變后:
返回給你的數據,就做了一些處理,這樣程序拿到最終數據的時候,根本不用處理,就可以直接使用,因為該類已經把需要解決的問題,搞定了
比如數據類型是ArrayArray的時候,請看下面的例子:
下面是一個同步的例子,接收到的數據類型是ArrayArray,拿到數據之后for循環一下,把該放的數據,放到相應位置,則完成同步。程序大大簡化了,不會我們拿到數據了還要處理,如果是第一次玩socket的,肯定還會碰到很多怪怪問題,比如數據不對,拿出來的數據有問題,還要進行分段處理什么的

CODE:
private function syncFun(e:ApplySocketEvent):void{
var tmpAr:Array = e.data as Array;
for(var i:int = 0; i < tmpAr.length; i ){
var ar:Array = tmpAr[i];
var _index:String = ar[1];
if(_index != index && (has(_index) || ar[0] == "create")){
switch(ar[0]){
case "create":
createTank(_index);
break;
case "move":
var moveStr:String = ar[2];
var moveAr:Array = moveStr.split("");
get(_index).move(expBoo(moveAr[0]),expBoo(moveAr[1]),expBoo(moveAr[2]),expBoo(moveAr[3]));
moveAr = null;
break;
case "bullet":
get(_index).bullet();
break;
case "shell":
get(_index).shell();
break;
case "turn":
var turnStr:String = ar[2];
var turnAr:Array = turnStr.split("");
get(_index).turn(expBoo(turnAr[0]),expBoo(turnAr[1]));
break;
}
}
ar = null;
}
tmpAr = null;
}
如果沒看懂,還有蝦米問題,就跟貼吧。。。

上一頁12 下一頁 閱讀全文
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 红安县| 青阳县| 崇明县| 时尚| 巴林左旗| 徐闻县| 句容市| 同江市| 甘孜| 奉贤区| 鲁甸县| 双流县| 修水县| 二连浩特市| 崇明县| 武邑县| 滁州市| 正蓝旗| 五寨县| 丁青县| 东乡县| 吴堡县| 淮阳县| 科尔| 连江县| 仪陇县| 宽甸| 额济纳旗| 松溪县| 赤城县| 普定县| 莱芜市| 宁阳县| 丹江口市| 隆安县| 商洛市| 蒲城县| 咸宁市| 永德县| 峨山| 安图县|