在《Flex与java进行socket通信完成以断点续传方式上传文件》中所实现的文件断点上传一次仅能上传一个文件,而flex自身不支持多线程,无法进行对多个文件开启多个线程进行socket文件传输,即不能循环文件数组来创建多个socket通信,令每个socket传输一个文件,这样做仅能上传一个有问题的文件。但我们可以采用递归方式来达到上传多文件的目的,这个过程类似于异步线程了。
建立socket通信后开始传输文件的过程中flex端监听三件事情:socket的连接、接收数据和socket通信的断开。当断开通信时即完成了一个文件的传输,此时如果还有文件需要传输,则可以继续新建socket通信,即调用该方法本身进行下一个文件的传输。下述示意代码包含在一个flex类中。
文件传输类中定义全局变量:
//文件总数量
private var fileCount:int = 0;
//当前传输的文件索引
private var currentIndex:int = 0;
//FileReference的数组,即文件数组
private var docList:Array;
主函数,用于调用上文中的递归函数,进行多文件传输
下文方法参数fileReferenceList为调用该方法的上层类中传入待上传的多个文件的数组
private function uploadDocumentContent(fileReferenceList:Array):void
{
fileCount = fileReferenceList.length;
this.docList = fileReferenceList;
if (docList != null && docList.length > 0)
{
this.uploadFile( docList[currentIndex] as FileReference );
}
}
递归函数,实现多文件断点上传的核心
private function uploadFile(file:FileReference){
var socket = new Socket;
socket.connect(CEConstants.SERVERIP,1234); //连接服务器
//监听是否连接
socket.addEventListener(Event.CONNECT,function conn(){
//发送名称
socket.writeUTF(file.name);
socket.flush();
//文件大小
socket.writeUTF(String(file.data.length));
socket.flush();
});
//监听接受数据
socket.addEventListener(ProgressEvent.SOCKET_DATA,function receiveData(){
//已上传大小
var len:String = socket.readUTF();
if(len == "0"){
if(file.data.length < 1024){
socket.writeBytes(file.data);
}else{
socket.writeBytes(file.data,0,1024);
}
socket.flush();
}else{
if((file.data.length - uint(len)) > 1024){
socket.writeBytes(file.data,uint(len),1024);
}else{
socket.writeBytes(file.data,uint(len),file.data.length - uint(len));
}
socket.flush();
}
});
//监听连接关闭
socket.addEventListener(Event.CLOSE,function closeConn(){
currentIndex++;
if(currentIndex < fileCount){
uploadFile(uploadFile( docList[currentIndex] as FileReference ));
}else{
Alert.show("上传成功");
CursorManager.removeAllCursors(); //去除鼠标样式
}
});
}
有了上文的工作,即可完成对多个文件断点上传的功能。在此功能之前的动作即为将客户端的文件加载到flash player上,即对FileReference等的利用了。值得说明的是虽然Flex自身不支持多线程,但是有一个开源项目async-threading能够使flex支持多线程,同java的多线程比较,此处为异步线程。拿多文件传输来说明,如果是多线程的话则多个文件会同时进行上传,而采用了此种,则多文件的上传不是同时进行的。上文代码则更为明显是一个传输完后再进行下一个文件的传输,而async-threading就包含类似于时间片的概念了。