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

这半年来一直在搞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();
			}
		}



这就是我的解包处理了,进过测试应该没有问题,拿出来跟大家交流下……转载请说明出处哦,毕竟是我的个人成果嘛~牛人如果检查到可改进的地方还请说明下啦
先看效果: https://pan.quark.cn/s/c7070e7537b1 [!NOTE] 每到答辩季我就会喜获stars,谢谢大家的支持! 欢迎推广传播本repo(https://.com/atomiechen/THU-PPT-Theme),也欢迎贡献变体,提供更多选择 清华简约主题PPT模板 Repo stars 2020年春夏之交,答辩期间很多同学都在寻找清华主题的答辩模板。 一方面有使用LaTeX制作Beamer的模板(见Overleaf上的模板THU Beamer Theme),另一方面民间也存在着一些PPT模板。 很多人可能不适应Beamer的使用(主要是内容和排版设计不是可见即所得,定制有门槛),以及我找到的PPT模板也都不太好使(要么图案设计太复杂、不好看,要么没有制作成PPT母版导致每次使用都要复制粘贴+微调,不方便)。 我制作了清华简约主题的PPT模板,后续有新的设计我会逐渐加入,也欢迎有兴趣有想法的朋友们添砖加瓦! 内容 所有模板均为 文件。 此外也提供转换脚本用于 Pandoc自动生成PPTX。 各个版本的修改历史见 CHANGELOG.md。 下载 推荐直接从 Releases 下载最新发布版。 也可以在 仓库 单独下载所需文件。 效果 16:9比例,v1留边、v1顶边、v3留边白底、v3顶边白底: demo 16:9比例,其他风格模板:v1扁平、v2扁平、v1暗光 demo2 其他变体设计参见 variants/README.md。 使用方式 可以基于所提供的文件自行修改内容,也可以在新建的PPT文稿中应用该模板。 后者在 MS Office 2019 For Mac 的 PowerPoint 里的具体使用方式为:首先选择幻灯片尺...
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值