加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flash Socket 底层接受数据的初级处理(as3.0)

发布时间:2020-12-15 06:14:41 所属栏目:百科 来源:网络整理
导读:flash去开发应用,,免不了网络通讯,特别是网络游戏,需要用到即使通讯。 as3提供了两个支持即时通讯的类:XMLSocket和Socket,前者其实是只支持发送字符串,而后者就强大多了,支持发送字节,相对来说比较底层,而这也给我们更多的发挥空间。 其实,flash s

flash去开发应用,,免不了网络通讯,特别是网络游戏,需要用到即使通讯。 as3提供了两个支持即时通讯的类:XMLSocket和Socket,前者其实是只支持发送字符串,而后者就强大多了,支持发送字节,相对来说比较底层,而这也给我们更多的发挥空间。 其实,flash socket的网络底层接受数据,就以与C++服务器通讯为例子,C++服务器一般会发一段一段数据过来,每段数据都是由一定结构组成的,一般是消息头和消息头,然后再逐步分层解析。 在这里,我只说接受网络底层的处理,一般一段数据前面,还有有一个4个字节左右的数据,表示的是后面网络流里的数据有多少.... 看下简单示意图

们网络底层需要做的处理,就是根据头4个字节判断出后面的数据大小,然后把那一整块取出来,抛给上层解析,然后又在不停地侦听,收到指定大小之后,又做类似的操作,下面看详细的代码
???

[plain] view plain copy print ?
  1. /**??
  2. ?*?@(#)NetBottomHandle.as??
  3. ?*?@author?soda.C??mail:sujun10@21cn.com??
  4. ?*?@version??1.0??
  5. ?*?<br>Copyright?(C),?2007?soda.C??
  6. ?*?<br>This?program?is?protected?by?copyright?laws.??
  7. ?*?<br>Program?Name:GameHall??
  8. ?*?@data?2008-3-20??
  9. ?*/??
  10. package?org.sujun.net???
  11. {??
  12. ????import?flash.net.Socket;??
  13. ????import?flash.events.ProgressEvent;??
  14. ????import?flash.utils.ByteArray;??
  15. ????/**??
  16. ?????*?socket数据流里的底层处理,从这里接受到服务器的数据,满足条件后就会抛出需要的字节??
  17. ?????*?对数据流的数据,不做任何处理??
  18. ?????*/??
  19. ????public?class?NetBottomHandle???
  20. ????{??
  21. ????????private?var?socket????????:Socket;??????????
  22. ????????private?var?listener????:Function;????????//接受网络解析出来的数据??
  23. ????????private?var?msgLen????????:int;????????????//消息长度??
  24. ????????private?var?msgLenMax????:int;????????????//收到的消息最大长度??
  25. ????????private?var?headLen????????:int;????????????//消息头长度??
  26. ????????private?var?isReadHead????:Boolean;????????//是否已经读了消息头??
  27. ????????private?var?bytes????????:ByteArray;????????//所读数据的缓冲数据,读出的数据放在这里??
  28. ??????????
  29. ????????public?function?NetBottomHandle()??
  30. ????????{??
  31. ????????????msgLenMax?=?5000;????//5000字节??
  32. ????????????headLen?=?4;????????//4个字节??
  33. ????????????bytes?=?new?ByteArray();??
  34. ??????????????
  35. ????????}??
  36. ????????/**??
  37. ?????????*?设置一个网络通讯实例??
  38. ?????????*/????
  39. ????????public?function?setSocket(socket:Socket):void??
  40. ????????{??
  41. ????????????this.socket?=?socket;??
  42. ????????????//监听......??
  43. ????????????socket.addEventListener(ProgressEvent.SOCKET_DATA,?onServerData,false,true);??
  44. ??????????????
  45. ??????????????
  46. ????????}??
  47. ????????/**??
  48. ?????????*?接受在网络层里收到的原始数据,传递过来的数据为描述长度,以及ByteArray对象functon(len,bytes)??
  49. ?????????*?@param?listener:接受数据函数??
  50. ?????????*/??
  51. ????????public?function?receiverNetData(listener:Function):void??
  52. ????????{??
  53. ????????????this.listener?=?listener;??
  54. ????????}??
  55. ????????/**??
  56. ?????????*?服务器发送过来的数据都在这里接收,最底层的??
  57. ?????????*/??
  58. ????????private?function?onServerData(event:ProgressEvent):void??
  59. ????????{??
  60. ????????????//一有收到数据的事件,就通过这个函数进行检验??
  61. ????????????parseNetData();??
  62. ????????}??
  63. ????????/**??
  64. ?????????*?解析网络数据流??
  65. ?????????*/??
  66. ????????private?function?parseNetData():void??
  67. ????????{??
  68. ????????????//如果需要读信息头??
  69. ????????????if(isReadHead)??
  70. ????????????{??
  71. ????????????????if(socket.bytesAvailable?>=?headLen)??
  72. ????????????????{??
  73. ????????????????????//读出指示后面的数据有多大??
  74. ????????????????????msgLen?=?socket.readUnsignedInt();??
  75. ????????????????????isReadHead?=?false;??
  76. ????????????????}??
  77. ????????????}??
  78. ????????????//如果已经读了信息头,则看能不能收到满足条件的字节数??
  79. ????????????if(!isReadHead?&&?msgLen?<=?msgLenMax)??
  80. ????????????{??
  81. ????????????????//如果为0,表示收到异常消息??
  82. ????????????????if(msgLen?==?0)??
  83. ????????????????{??
  84. ????????????????????//一般消息长度为0的话,表示与服务器出了错,或者即将被断开等,通知客户端,进行特别处理??
  85. ????????????????????listener(msgLen,null);??
  86. ????????????????????return?;??
  87. ????????????????}??
  88. ????????????????//数据流里的数据满足条件,开始读数据??
  89. ????????????????if(socket.bytesAvailable?>=?msgLen)??
  90. ????????????????{??
  91. ????????????????????//指针回归??
  92. ????????????????????bytes.position?=?0;??
  93. ????????????????????//取出指定长度的网络字节??
  94. ????????????????????socket.readBytes(bytes,?0,?msgLen);??
  95. ????????????????????listener(msgLen,bytes);??
  96. ????????????????}??
  97. ????????????}??
  98. ????????????isReadHead?=?false;??
  99. ????????????//如果数据流里还满足读取数据条件,继续读取数据??
  100. ????????????if(socket.bytesAvailable?>=?headLen)??
  101. ????????????{??
  102. ????????????????parseNetData();??
  103. ????????????}??
  104. ????????}??
  105. ????}??
  106. }??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读