2
3import java.io.File
4import java.io.IOException
5import java.io.InputStream
6import java.io.RandomAccessFile
7import java.net.HttpURLConnection
8import java.net.MalformedURLException
9import java.net.URL
10
11//断点续传
12public class DownLoad {
13
14public static void down(String URL, long nPos, String savePathAndFile) {
15try {
16URL url = new URL(URL)
17HttpURLConnection httpConnection = (HttpURLConnection) url
18.openConnection()
19// 设置User-Agent
20httpConnection.setRequestProperty("User-Agent", "NetFox")
21// 设置断点续传的开始位置档尺销
22httpConnection.setRequestProperty("RANGE", "bytes=" + nPos)
23// 获得输困帆入流
24InputStream input = httpConnection.getInputStream()
25RandomAccessFile oSavedFile = new RandomAccessFile(savePathAndFile,
26"rw")
27// 定位文件指针到nPos位置
28oSavedFile.seek(nPos)
29byte[] b = new byte[1024]
30int nRead
31/行游/ 从输入流中读入字节流,然后写到文件中
32while ((nRead = input.read(b, 0, 1024)) >0) {
33(oSavedFile).write(b, 0, nRead)
34}
35httpConnection.disconnect()
36} catch (MalformedURLException e) {
37e.printStackTrace()
38} catch (IOException e) {
39e.printStackTrace()
40}
41}
42
43public static long getRemoteFileSize(String url) {
44long size = 0
45try {
46HttpURLConnection conn = (HttpURLConnection) (new URL(url))
47.openConnection()
48size = conn.getContentLength()
49conn.disconnect()
50} catch (Exception e) {
51e.printStackTrace()
52}
53return size
54}
55
56public static void main(String[] args) {
57 String url = " http://www.videosource.cgogo.com/media/0/16/8678/8678.flv"
58String savePath = "F:\\"
59String fileName = url.substring(url.lastIndexOf("/"))
60String fileNam=fileName
61HttpURLConnection conn = null
62try {
63conn = (HttpURLConnection) (new URL(url)).openConnection()
64} catch (Exception e) {
65e.printStackTrace()
66}
67File file = new File(savePath + fileName)
68// 获得远程文件大小
69long remoteFileSize = getRemoteFileSize(url)
70System.out.println("远程文件大小="+remoteFileSize)
71int i = 0
72if (file.exists()) {
73// 先看看是否是完整的,完整,换名字,跳出循环,不完整,继续下载
74long localFileSize = file.length()
75System.out.println("已有文件大小为:"+localFileSize)
76
77if (localFileSize <remoteFileSize) {
78System.out.println("文件续传")
79down(url, localFileSize, savePath + fileName)
80}else{
81System.out.println("文件存在,重新下载")
82do{
83i++
84fileName = fileNam.substring(0, fileNam.indexOf(".")) + "(" + i
85+ ")" + fileNam.substring(fileNam.indexOf("."))
86
87file = new File(savePath + fileName)
88}while(file.exists())
89try {
90file.createNewFile()
91} catch (IOException e) {
92e.printStackTrace()
93}
94down(url, 0, savePath + fileName)
95}
96// 下面表示文件存在,改名字
97
98} else {
99try {
100file.createNewFile()
101System.out.println("下载中")
102down(url, 0, savePath + fileName)
103} catch (IOException e) {
104e.printStackTrace()
105}
106}
107}}
108
断点续传一般是把文件分成固定大小的包,比如128字节为1个包,然后客户端记录下传了多少个完整的包,断了以后悔虚,下次再连接的时候直接请求从前一个包那里传。批量传输,把整个悉前亮要睁宽传输的文件分成N个部分,然后启动N个线程,每个线程负责下载1部分。这样就达到充分利用网络带宽了。
设备往你这边传输数据时,你得知他的设备ID、数据的MD5校验值、 *** 作授权代码。传输数据开始,设备向你这边胡逗传输数据,你这边将受到的数据保存到文件或者数据库。传输过程中,你可能要告诉设备已经保存的数据字节数。
假如网络连接异常,按派告照你说的思路,发送心跳包检测连接情况。你这边程序将本次尘做明 *** 作的数据保存、并将设备ID、数据MD5校验值、 *** 作授权码、已保存的字节数保存到日志。
下次客户端请求续传,你就校验它的设备ID、 *** 作授权代码,然后再告诉它从哪里开始续传,跳过那些字节。
续传完成,通知客户端,续传成功。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)