/**
* E2即时通UDP文件传输发起方
*/
public class ObjectA extends EventDispatcher
{
private var _sock:DatagramSocket;
private var _toip:String;
private var _toport:uint;
//数据包大小,1024bytes
private const _packsize:uint = 1019;
private var _packnum:uint = 0;
private var data:ByteArray= new ByteArray();
/**
* obj发送对象,sock本机socket,toip对方IP,toport对方端口
*/
public function ObjectA(sock:DatagramSocket,toip:String,toport:int)
{
_toip = toip;
_toport = toport;
_sock = sock;
_sock.addEventListener(DatagramSocketDataEvent.DATA,dataReceive);
_sock.receive();
}
/**
* 格式化传输数据并告知B要开始传输,命令头为1
*/
public function invokeB(obj:Object):void{
data.writeObject(obj);
//重置数据读取流,注意读取操作并不改变data所包含内容
data.position = 0;
trace(data.bytesAvailable);
_packnum = data.bytesAvailable/_packsize;
if(data.bytesAvailable%_packsize>0){
_packnum++;
}
var buffer:ByteArray = new ByteArray();
buffer.writeByte(1);
buffer.writeUnsignedInt(_packnum);
buffer.position = 0;
_sock.send(buffer,0,buffer.bytesAvailable,_toip,_toport);
}
/**
* 控制通道SOCKET接收数据事件处理
*/
private function dataReceive(e:DatagramSocketDataEvent):void{
var cmd:int = e.data.readByte();
var ret:ByteArray = new ByteArray();
switch(cmd){
case 1: //接受传输文件请求
transferOnce();
break;
case 2:
var buffer:ByteArray = new ByteArray();
while(e.data.bytesAvailable){
var packnum:uint = e.data.readUnsignedInt();
//reset package position and read length
this.data.position = (packnum*_packsize);
var vlen:uint = _packsize;
if(packnum==_packnum){
vlen = this.data.bytesAvailable;
}
//写入数据命令头0
buffer.writeByte(0);
//写入长度为packnum的包头
buffer.writeUnsignedInt(packnum);
//写入长度为vlen的包内容
var n:int = 0;
for(var j:uint=0;j<vlen;j++){
n = this.data.readByte();
buffer.writeByte(n);
}
//send package to client B
buffer.position = 0;
_sock.send(buffer,0,buffer.bytesAvailable,_toip,_toport);
buffer.clear();
}
//发送成功,发送结束标志,命令头为2
buffer.writeByte(2);
buffer.position = 0;
_sock.send(buffer,0,buffer.bytesAvailable,_toip,_toport);
break;
case 3:
this.dispatchEvent(new UDPEvent(UDPEvent.Complete));
this.finalize();
break;
default:
break;
}
}
/**
* 分片传输所有数据包,命令头为0
*/
private function transferOnce():void{
var buffer:ByteArray = new ByteArray();
var i:int = 0;
var n:int = 0;
while(this.data.bytesAvailable){
i++;
var vlen:uint = _packsize;
if(vlen>this.data.bytesAvailable){
vlen = data.bytesAvailable;
}
//写入数据命令头0
buffer.writeByte(0);
//写入长度为i的包头
buffer.writeUnsignedInt(i);
//写入长度为vlen的包内容
for(var j:uint=0;j<vlen;j++){
n = this.data.readByte();
buffer.writeByte(n);
}
var udpevent:UDPEvent = new UDPEvent(UDPEvent.Process,i/_packnum);
this.dispatchEvent(udpevent);
buffer.position = 0;
_sock.send(buffer,0,buffer.bytesAvailable,_toip,_toport);
buffer.clear();
}
//发送成功,发送结束标志,命令头为2
buffer.writeByte(2);
buffer.position = 0;
_sock.send(buffer,0,buffer.bytesAvailable,_toip,_toport);
}
/**
* 释放资源
*/
private function finalize():void{
this._packnum=0;
this.data.clear();
}
}
}