|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
ActionScript是一种程序语言的简单文本文件.FLA档案能够直接包含ActionScript。
后面进修了FlashAS3教程:运算符,明天进修的ApplySocket类,这个类是对socket使用就好了体系化封装,而且思索了良多要素,整合出来的一套,较为完美的flash程序部分socket办理计划
好比:一些socket服务端,纷歧定你send已往一条,他即刻就会转发,大概会有延时,大概数据堆在一同等征象,而有写socket服务端,在发送数据的时分,会有一些附加码等,如许倒霉于掏出实在数据
该类除一般的用法,就是对上述假定情形整合了一套办理计划,虽不是很完美,可是能办理年夜部分成绩,最少我碰着过的成绩,用这个类应当能够轻松弄定,而且能够合适更庞大的
别的光看解说,大概不年夜懂,供应了甚么办理计划,来办理下面这些成绩,因而,贫苦人人赖着性质,先过一到代码,然后在看前面的用法
index.base.net.ApplySocket类:
对socket举行封装,而且供应多种socket办理计划
机关函数:
publicfunctionApplySocket(_isSide:Boolean=false,_datatype:String="String")
第一参数,是不是利用包边,对数据举行处置,具体请看isSide属性
第二参数,默许数据公布范例
假如机关函数中两个参数都是用默许值,则该类只是一个普一般通的socket类
connect办法:
publicfunctionconnect(_host:String,_port:int):void
毗连远程socket服务端
第一参数:主机地点,能够是202.89.***.***,大概www.*****.com如许的
第二参数:毗连的端标语
send办法:
publicfunctionsend(...strs):void
发送数据到socket服务端
假如datatype为Object大概ArrayObject的时分,send办法传进的参数必需年夜于大概即是两个!不然会激发毛病!
close办法:
publicfunctionclose():void
封闭与远程服务端毗连
connect事务:
当毗连上了以后,会调剂该事务
close事务:
当socket封闭后,会调剂该事务
sync事务:
当无数据必要同步的时分,会调剂该事务
error事务:
当毗连失利的时分,会调剂该事务
静态常量:
publicstaticconstARRAY:String="Array";
publicstaticconstSTRING:String="String";
publicstaticconstOBJECT:String="Object";
publicstaticconstARRAY_ARRAY:String="ArrayArray";
publicstaticconstARRAY_OBJECT:String="ArrayObject";
分离暗示datatype的5品种型
host属性:
publicvarhost:String;
当connect后,会主动把主机地点纪录到该值上
port属性:
publicvarport:int;
当connect后,会主动把毗连端标语纪录到该值上
space属性:
publicvarspace:String="";
当send传进2个大概2个以上参数时,接纳何种值举行离隔,默许是空格,假如将值改成"",则暗示不必距离举行离隔
ls属性:
publicvarls:String="{";
当isSide为true的时分,放在右边所利用的暗号
rs属性:
publicvarrs:String="}";
当isSide为true的时分,放在右侧所利用的暗号
connected属性:
publicvarconnected:Boolean;
前往socket是不是已毗连上
isSide属性:
publicvarisSide:Boolean;
是不是加上包边处置
假如该值为true,则暗示,send传进的参数都将会用rs和ls包起来举行传输到socket端,当socket原版前往数据的时分,在利用正则将真实的数据掏出来,而且以datatype范例前往
反之,则不做任那边理。
datatype属性:
publicvardatatype:String;
公布同步事务的时分,data接纳何品种型前往
String:以字符串前往,就是说传进甚么前往甚么
Array:以数组前往,选择利用Array前往的时分,isSide值必需为true,不然没法断点找出数组,道理就是,经由过程利用lsrs两个标记包起来,然后利用正则把标记中的数据提掏出来,而且前往数组。假如,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:
privatefunctionsyncFun(e:ApplySocketEvent):void{
vartmpAr:Array=e.dataasArray;
for(vari:int=0;i<tmpAr.length;i++){
varar:Array=tmpAr;
var_index:String=ar[1];
if(_index!=index&&(has(_index)||ar[0]=="create")){
switch(ar[0]){
case"create":
createTank(_index);
break;
case"move":
varmoveStr:String=ar[2];
varmoveAr: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":
varturnStr:String=ar[2];
varturnAr:Array=turnStr.split("");
get(_index).turn(expBoo(turnAr[0]),expBoo(turnAr[1]));
break;
}
}
ar=null;
}
tmpAr=null;
}假如没看懂,另有虾米成绩,就跟贴吧。。。
ApplySocket类源代码:
CODE:
packageindex.base.net{
importflash.events.EventDispatcher;
importflash.events.ProgressEvent;
importflash.events.IOErrorEvent;
importflash.events.Event;
importflash.net.Socket;
importindex.base.events.ApplySocketEvent;
publicclassApplySocketextendsEventDispatcher{
privatevarsocket:Socket;
publicstaticconstARRAY:String="Array";
publicstaticconstSTRING:String="String";
publicstaticconstOBJECT:String="Object";
publicstaticconstARRAY_ARRAY:String="ArrayArray";
publicstaticconstARRAY_OBJECT:String="ArrayObject";
publicvarhost:String;
publicvarport:int;
publicvarspace:String="";
publicvarls:String="{";
publicvarrs:String="}";
publicvarisSide:Boolean;
publicvardatatype:String;
publicvarconnected:Boolean=false;
publicfunctionApplySocket(_isSide:Boolean=false,_datatype:String="String"){
isSide=_isSide;
datatype=_datatype;
}
//毗连
publicfunctionconnect(_host:String,_port:int):void{
host=_host;
port=_port;
if(connected)socket.close();
socket=newSocket;
socket.connect(host,port);
socket.addEventListener(IOErrorEvent.IO_ERROR,errorFun);
socket.addEventListener(Event.CONNECT,connectFun);
}
//发送
publicfunctionsend(...strs):void{
if(datatype==OBJECT||datatype==ARRAY_OBJECT){
if(strs.length<2)thrownewError("当数据范例即是Object大概ArrayObject的时分,send办法传进参数必需两个大概两个以上!");
}
varstr:String="";
for(vari:int=0;i<strs.length;i++){
str+=strs;
if(i!=strs.length-1)str+=space;
}
if(isSide)str=ls+str+rs;
socket.writeUTFBytes(str);
socket.flush();
}
//断开
publicfunctionclose():void{
clearEvent();
connected=false;
socket.close();
socket=null;
}
//毗连事务
privatefunctionconnectFun(e:Event):void{
connected=true;
clearEvent();
socket.addEventListener(ProgressEvent.SOCKET_DATA,socketDataFun);
socket.addEventListener(Event.CLOSE,closeFun);
dispatchEvent(newApplySocketEvent(ApplySocketEvent.CONNECT));
}
//封闭事务
privatefunctioncloseFun(e:Event):void{
connected=false;
dispatchEvent(newApplySocketEvent(ApplySocketEvent.CLOSE));
}
//失利事务
privatefunctionerrorFun(e:IOErrorEvent):void{
close();
dispatchEvent(newApplySocketEvent(ApplySocketEvent.ERROR));
}
//吸收事务
privatefunctionsocketDataFun(e:ProgressEvent):void{
vari:int;
vartmp:Object=socket.readUTFBytes(socket.bytesAvailable);
if(isSide){
tmp=tmp.match(newRegExp(""+ls+"[^"+rs+"]*"+rs,"g"));
for(i=0;i<tmp.length;i++){
varstr:String=tmp;
tmp=str.substr(1,str.length-2);
}
}
switch(datatype){
caseSTRING:
if(tmpisArray)tmp=tmp.join("");
break;
caseARRAY:
if(tmpisString)thrownewError("毛病!假如数据范例选择Array,那末isSide必需为true!");
break;
caseOBJECT:
if(tmpisArray)thrownewError("毛病!假如数据范例选择Object,那末isSide必需为false!");
tmp=change(tmpasString);
break;
caseARRAY_OBJECT:
if(tmpisString)thrownewError("毛病!假如数据范例选择ArrayObject,那末isSide必需为true!");
for(i=0;i<tmp.length;i++)tmp=change(tmp);
break;
caseARRAY_ARRAY:
if(tmpisString)thrownewError("毛病!假如数据范例选择ArrayArray,那末isSide必需为true!");
for(i=0;i<tmp.length;i++)tmp=tmp.split(space);
break;
}
vareve:ApplySocketEvent=newApplySocketEvent(ApplySocketEvent.SYNC);
eve.data=tmp;
dispatchEvent(eve);
tmp=null;
eve=null;
}
//清算事务侦听
privatefunctionclearEvent():void{
if(socket!=null){
if(socket.hasEventListener(IOErrorEvent.IO_ERROR))socket.removeEventListener(IOErrorEvent.IO_ERROR,errorFun);
if(socket.hasEventListener(Event.CONNECT))socket.removeEventListener(Event.CONNECT,connectFun);
if(socket.hasEventListener(ProgressEvent.SOCKET_DATA))socket.removeEventListener(ProgressEvent.SOCKET_DATA,socketDataFun);
if(socket.hasEventListener(Event.CLOSE))socket.removeEventListener(Event.CLOSE,closeFun);
}
}
//转换Object
privatefunctionchange(tmp:String):Object{
vartmpAr:Array=tmp.split(space);
varobj:Object=newObject;
obj[tmpAr.shift()]=tmpAr.join(space);
tmpAr=null;
returnobj;
}
}
}ApplySocketEvent事务类源代码
CODE:
packageindex.base.events{
importflash.events.Event;
publicclassApplySocketEventextendsEvent{
publicstaticconstCONNECT:String="connect";
publicstaticconstCLOSE:String="close";
publicstaticconstSYNC:String="sync";
publicstaticconstERROR:String="error";
publicvardata:Object;
publicfunctionApplySocketEvent(type:String){
super(type);
}
}
}
借助令人兴奋的全新3D平移和旋转工具,通过3D空间为2D对象创作动画,您可以沿x、y、z轴创作动画。 |
|