📄 readmsg.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 + -