⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readmsg.as

📁 解析底层流数据的AS类,根据包的长度一条一条读.
💻 AS
字号:
/**
 * @(#)NetBottomHandle.as
 * @author soda.C  mail:sujun10@21cn.com
 * @version  1.0
 * <br>Copyright (C), 2007 soda.C
 * <br>This program is protected by copyright laws.
 * <br>Program Name:GameHall
 * @data 2008-3-20
 */
package org.sujun.net 
{
	import flash.net.Socket;
	import flash.events.ProgressEvent;
	import flash.utils.ByteArray;
	/**
	 * socket数据流里的底层处理,从这里接受到服务器的数据,满足条件后就会抛出需要的字节
	 * 对数据流的数据,不做任何处理
	 */
	public class NetBottomHandle 
	{
		private var socket		:Socket;		
		private var listener	:Function;		//接受网络解析出来的数据
		private var msgLen		:int;			//消息长度
		private var msgLenMax	:int;			//收到的消息最大长度
		private var headLen		:int;			//消息头长度
		private var isReadHead	:Boolean;		//是否已经读了消息头
		private var bytes		:ByteArray;		//所读数据的缓冲数据,读出的数据放在这里
		
		public function NetBottomHandle()
		{
			msgLenMax = 5000;	//5000字节
			headLen = 4;		//4个字节
			bytes = new ByteArray();
			
		}
		/**
		 * 设置一个网络通讯实例
		 */  
		public function setSocket(socket:Socket):void
		{
			this.socket = socket;
			//监听......
			socket.addEventListener(ProgressEvent.SOCKET_DATA, onServerData,false,0,true);
			
			
		}
		/**
		 * 接受在网络层里收到的原始数据,传递过来的数据为描述长度,以及ByteArray对象functon(len,bytes)
		 * @param listener:接受数据函数
		 */
		public function receiverNetData(listener:Function):void
		{
			this.listener = listener;
		}
		/**
		 * 服务器发送过来的数据都在这里接收,最底层的
		 */
		private function onServerData(event:ProgressEvent):void
		{
			//一有收到数据的事件,就通过这个函数进行检验
			parseNetData();
		}
		/**
		 * 解析网络数据流
		 */
		private function parseNetData():void
		{
			//如果需要读信息头
			if(isReadHead)
			{
				if(socket.bytesAvailable >= headLen)
				{
					//读出指示后面的数据有多大
					msgLen = socket.readUnsignedInt();
					isReadHead = false;
				}
			}
			//如果已经读了信息头,则看能不能收到满足条件的字节数
			if(!isReadHead && msgLen <= msgLenMax)
			{
				//如果为0,表示收到异常消息
				if(msgLen == 0)
				{
					//一般消息长度为0的话,表示与服务器出了错,或者即将被断开等,通知客户端,进行特别处理
					listener(msgLen,null);
					return ;
				}
				//数据流里的数据满足条件,开始读数据
				if(socket.bytesAvailable >= msgLen)
				{
					//指针回归
					bytes.position = 0;
					//取出指定长度的网络字节
					socket.readBytes(bytes, 0, msgLen);
					listener(msgLen,bytes);
				}
			}
			isReadHead = false;
			//如果数据流里还满足读取数据条件,继续读取数据
			if(socket.bytesAvailable >= headLen)
			{
				parseNetData();
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -