查看: 890|回复: 0

Flash AS3教程:ApplySocket类(1)

[复制链接]
发表于 2009-5-15 02:05:06 | 显示全部楼层 |阅读模式
今天学习的ApplySocket类,这个类是对socket应用就行了系统化封装,并且考虑了很多因素,整合出来的一套,较为完善的flash程序部分socket解决方案<br /><br />比如:一些socket服务端,不一定你send过去一条,他马上就会转发,可能会有延时,或者数据堆在一起等现象,而有写socket服务端,在发送数据的时候,会有一些附加码等,这样不利于取出真实数据<br /><br />该类除了普通的用法,就是对上述假设情况整合了一套解决方案,虽不是很完善,但是能解决大部分问题,至少我碰到过的问题,用这个类应该可以轻松搞定,并且可以适合更复杂的<br /><br />另外光看讲解,可能不大懂,提供了什么解决方案,来解决上面这些问题,因此,麻烦大家赖着性子,先过一到代码,然后在看后面的用法<br /><br />index.base.net.ApplySocket类:<br />对socket进行封装,并且提供多种socket解决方案<br /><br />构造函数:<br />public function ApplySocket(_isSide:Boolean = false,_datatype:String = &quot;String&quot;)<br />第一参数,是否使用包边,对数据进行处理,详细请看isSide属性<br />第二参数,默认数据发布类型<br />如果构造函数中两个参数都是用默认值,则该类只是一个普普通通的socket类<br /><br />connect方法:<br />public function connect(_host:String,_port:int):void<br />连接远程socket服务端<br />第一参数:主机地址,可以是202.89.***.***,或者www.*****.com这样的<br />第二参数:连接的端口号<br /><br />send方法:<br />public function send(...strs):void<br />发送数据到socket服务端<br />如果datatype为Object或者ArrayObject的时候,send方法传入的参数必须大于或者等于两个!否则会引发错误!<br /><br />close方法:<br />public function close():void<br />关闭与远程服务端连接<br /><br />connect事件:<br />当连接上了之后,会调度该事件<br /><br />close事件:<br />当socket关闭后,会调度该事件<br /><br />sync事件:<br />当有数据需要同步的时候,会调度该事件<br /><br />error事件:<br />当连接失败的时候,会调度该事件<br /><br />静态常量:<br />public static const ARRAY:String = &quot;Array&quot;;<br />public static const STRING:String = &quot;String&quot;;<br />public static const OBJECT:String = &quot;Object&quot;;<br />public static const ARRAY_ARRAY:String = &quot;ArrayArray&quot;;<br />public static const ARRAY_OBJECT:String = &quot;ArrayObject&quot;;<br />分别表示datatype的5种类型<br /><br />host属性:<br />public var host:String;<br />当connect后,会自动把主机地址记录到该值上<br /><br />port属性:<br />public var port:int;<br />当connect后,会自动把连接端口号记录到该值上<br /><br />space属性:<br />public var space:String = &quot; &quot;;<br />当send传入2个或者2个以上参数时,采用何种值进行隔开,默认是 空格,如果将值改为&quot;&quot;,则表示不用间隔进行隔开<br /><br />ls属性:<br />public var ls:String = &quot;{&quot;;<br />当isSide为true的时候,放在左边所使用的记号<br /><br />rs属性:<br />public var rs:String = &quot;}&quot;;<br />当isSide为true的时候,放在右边所使用的记号<br /><br />connected属性:<br />public var connected:Boolean;<br />返回socket是否已连接上<br /><br />isSide属性:<br />public var isSide:Boolean;<br />是否加上包边处理<br />如果该值为true,则表示,send传入的参数都将会用rs和ls包起来进行传输到socket端,当socket原版返回数据的时候,在使用正则将真正的数据取出来,并且以datatype类型返回<br />反之,则不做任何处理。<br /><br />datatype属性:<br />public var datatype:String;<br />发布同步事件的时候,data采用何种类型返回<br />String:以字符串返回,就是说传入什么返回什么<br /><br />Array:以数组返回,选择使用Array返回的时候,isSide值必须为true,否则无法断点找出数组,原理就是,通过使用ls rs两个符号包起来,然后使用正则把符号中的数据提取出来,并且返回数组。如果,socket服务端,可能还会抛出其他数据给客户端,那么采用isSide包边处理,则socket回传的数据,该类会自动处理,将send出去的数据原本拿下来,回传数据不受影响<br /><br />Object:以Object返回,如果send过去的数据,都是以一个变量名一个参数值来传输的,那么可以采用Object来接收数据,这样的话,返回data中,直接返回send进去的第一个参数,即可获得值(该类型不常用,一般只在特殊情况使用)<br /><br />ArrayArray:以数组嵌套数组的形式返回数据,如果socket的执行效率不是很高,或者同步要求不是很高,那么客户端send一次,未必会接收到同步事件,可能会堆积在一起,一起发送到客户端,这个时候,就可以采用ArrayArray的形式,那么该类会帮你把send过去的数据,重新划分,并且以一个数组为一个send数据的形式返回,很利于做连连看,对对碰类似同步不是很即时,很多个动作可以堆积到一起来发送<br /><br />ArrayObject:以数组嵌套Object的形式返回数据,不过多说,只不过是Array加上Object的符合模式而已(该类型也不常用)<br /><br />Object与ArrayObject,很适合用在群聊天室,比如send(&quot;sunbright&quot;,&quot;大家好{哈 哈}&quot;);那么即时你在说话的内容加了很多怪怪符号,比如加上分隔符,空格等等,因为Object的解析原理是,拿出第一个参数做为引用变量名,然后把后面的所有数据赋值给这个引用变量名来返回,所有后面的数据不管怎么样,都是不会破坏数据内容,即得到data数据后只要返回data的sunbright值,即可得到说话内容,不会因为格式错误,而把说话的内容有所改变<br /><br />该类的作用在datatype属性中,讲了很多东西<br />下面讲讲应用:<br />该类的关键就在于isSide和datatype两个值,<br />如果isSide为true,那么就等于启用了数据包边处理,那么当你调用send方法传入某些参数,只要socket方做到的是,传进去什么他返回给你什么,那么通过同步事件,又会自动把处理过的数据,拿出来,做到数据的准确性,不会因为传了很多参数,有时候会紊乱。<br /><br />而当datatype的属性改变后:<br />返回给你的数据,就做了一些处理,这样程序拿到最终数据的时候,根本不用处理,就可以直接使用,因为该类已经把需要解决的问题,搞定了<br />比如数据类型是ArrayArray的时候,请看下面的例子:<br />下面是一个同步的例子,接收到的数据类型是ArrayArray,拿到数据之后for循环一下,把该放的数据,放到相应位置,则完成同步。程序大大简化了,不会我们拿到数据了还要处理,如果是第一次玩socket的,肯定还会碰到很多怪怪问题,比如数据不对,拿出来的数据有问题,还要进行分段处理什么的<br /><br />CODE:<br />private function syncFun(e:ApplySocketEvent):void{<br />        var tmpAr:Array = e.data as Array;<br />        for(var i:int = 0; i &lt; tmpAr.length; i ++){<br />                var ar:Array = tmpAr;<br />                var _index:String = ar[1];<br />                if(_index != index &amp;&amp; (has(_index) || ar[0] == &quot;create&quot;)){<br />                        switch(ar[0]){<br />                                case &quot;create&quot;:<br />                                        createTank(_index);<br />                                break;<br />                                case &quot;move&quot;:<br />                                        var moveStr:String = ar[2];<br />                                        var moveAr:Array = moveStr.split(&quot;&quot;);<br />                                        get(_index).move(expBoo(moveAr[0]),expBoo(moveAr[1]),expBoo(moveAr[2]),expBoo(moveAr[3]));<br />                                        moveAr = null;<br />                                break;<br />                                case &quot;bullet&quot;:<br />                                        get(_index).bullet();<br />                                break;<br />                                case &quot;shell&quot;:<br />                                        get(_index).shell();<br />                                break;<br />                                case &quot;turn&quot;:<br />                                        var turnStr:String = ar[2];<br />                                        var turnAr:Array = turnStr.split(&quot;&quot;);<br />                                        get(_index).turn(expBoo(turnAr[0]),expBoo(turnAr[1]));<br />                                break;<br />                        }<br />                }<br />                ar = null;<br />        }<br />        tmpAr = null;<br />}<br /><br /><blockquote class="blockquote">From: http://www.photoep.cn/read.php?tid=100  Powered by PHPWind.com</blockquote>
回复

使用道具 举报

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部