上传到服务器原理
商议客户端将文件长度Length、文件名Name、Id文件id以协议的形式发送到服务器。服务器判断Id是否为空,不为空时表示是断点上传,从存储断点上传文件的数据库中根据文件Id查询文件保存的Path并将Path返回,根据Path从上次的历史文件中读取上传的断点位置(断点位置记录在临时文件的*.log文件里的Properties部分了)
如果Id为空,则为初次上传,生成id,将id和path添加到数据库里
然后向客户端发送协议头Id(?包括记录断点位置的变量position,=0表示初次,=p表示断点位置)并判断是否传输完毕。传输完毕删除数据库中的记录和临时文件,没有传输完毕继续传输
文件上传到客户端:
原理:
客户端从本地数据库(数据库包括文件本地路径path,服务器返回的id)查询有无上传记录有的话构造协议(文件长度、文件名字、id);没有的话构造协议中id=null;socket请求返回字段id和position与如果第一次上传返回服务器随机生成唯一id里position=0就是第一次上传,将(id,path)添加到数据库;否则就是断点续传id=sourceid,position为上次上传的历史记录位置,从position开始上传并监视是否完成,上传完成时删除数据库存储的记录,没有上传完成时继续上传。
下面是多线程下载
原理:
连接服务器获取下载文件的大小,根据数据库中存放的信息(id=下载路径,Date=map(线程id,进度position))判断文件是否已经存在。不存在,划分每个线程下载文件大小,启动多线程下载;存在,从数据库获取每个线程已加载的长度。开始下载并监视,未完成,将每个线程已下载位置存放在数据库;完成,结束