ActionScript 3.0 之socket的数据解包【精华】

4 篇文章 0 订阅
4 篇文章 0 订阅

这半年来一直在搞AS3的socket,包含同C++和Java之间的通信,在这里,公开一下,个人的研究成果:
两个类:ChatPacket.as 和 ChatDataHandler 是我聊天的自定义的包。
其中主要难点还是在于封包和解包的过程,封包就不用说了,关键是解包:
socket接受的数据不是按照你服务端发送时候,完整的过来,有时候会先接受一部分,推进socket里面,然后在过一会儿继续推进,所以需要进行一个完整的解包处理。
首先是包定义

       /**
	 * mark:short = 0x4235
	 * size:short
	 * chanel:byte;
	 * data:String
	 * end:short = 0x5324
	 * @author chzcb
	 * @email chzcb2008@gmail.com
	 * 
	 */
	public class ChatPacket implements IPacket
	{
		private var _mark:int = 0x4235;
		private var _size:int;
		private var _channel:int;
		private var _content:ByteArray;
		private var _end:int = 0x5324;
		
		private var _bytes:ByteArray;

                //一下略过1000字,呵呵
         }


头标识和尾标识自己定义哈……

接下来是关键部分解包

public function handler(socket:Socket):void
		{
			if(socket.bytesAvailable){
				//读进缓存
				socket.readBytes(buffer,buffer.length,socket.bytesAvailable);
				//从缓存头开始进行读取
				buffer.position = 0;
				while(buffer.bytesAvailable){
					mark = buffer.readUnsignedShort();
					if(mark == 0x4235){
						size = buffer.readUnsignedShort();
						if(buffer.bytesAvailable<size+3){//如果缓存的长度不足内容+频道+尾标识的总长度,就等待数据
							buffer.position = 0;
							return;
						}
						channel = buffer.readUnsignedByte();//频道
						content.clear();
						if(size>0)
							buffer.readBytes(content,0,size);
						end = buffer.readUnsignedShort();
						if(end == 0x5324){
							var packet:ChatPacket = new ChatPacket();
							packet.channel = channel;
							packet.content = content;
							var event:NetEvent = new NetEvent(NetEvent.SEND_PACKAGE);
							event.data = packet;
							socket.dispatchEvent(event);
						}
						else
						{
							throw new Error("包不完整");
						}
					}
					else
					{
						throw new Error("包头错误");
					}
				}
				buffer.clear();
			}
		}



这就是我的解包处理了,进过测试应该没有问题,拿出来跟大家交流下……转载请说明出处哦,毕竟是我的个人成果嘛~牛人如果检查到可改进的地方还请说明下啦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值