结合flex socket以递归方式实现多文件断点上传文件

来源:互联网 发布:清理系统垃圾软件 编辑:程序博客网 时间:2024/06/06 03:26

在《Flexjava进行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就包含类似于时间片的概念了。

原创粉丝点击