Java Socket如何实现文件的断点续传,有代码更好

Java Socket如何实现文件的断点续传,有代码更好,第1张

1package com.tangshun.www.socket

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、 *** 作授权代码,然后再告诉它从哪里开始续传,跳过那些字节。

续传完成,通知客户端,续传成功。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12265767.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存