Flash AS3教程:ApplySocket类
比如:一些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;
}