يمكن فهم موضوع كقناة تنزيل. موضوع واحد هو قناة تنزيل الملف. مؤشرات ترابط متعددة تعني فتح العديد من قنوات التنزيل في نفس الوقت. عندما يوفر الخادم خدمات التنزيل ، يشارك تنزيل المستخدم عرض النطاق الترددي. عندما تكون الأولوية هي نفسها ، سيقوم الخادم الكلي بتخصيص مؤشر ترابط التنزيل الكلي بالتساوي. ليس من الصعب فهمها. إذا كان لديك العديد من المواضيع ، فكلما زاد تنزيله.
يدعم برنامج التنزيل الشهير متعدد الخيوط ويدعم تنزيلات توقف في منتصف الوقت. عندما تبدأ من جديد ، لن تنزيل من الصفر.
خطوات تنفيذ وظيفتين هي كما يلي:
(1) عند الاتصال بملف مورد التنزيل ، حدد أولاً حجم ملف المورد وإنشاء ملف مؤقت من نفس الحجم محليًا لتخزين بيانات التنزيل.
(2) تحديد حجم الملف المطلوب لكل مؤشر ترابط بناءً على عدد مؤشرات الترابط
(3) تحديد موقع تنزيل البدء والنهاية لكل مؤشر ترابط وفقًا لحجم الملف وعدد مؤشرات الترابط التي تم تنزيلها بواسطة كل مؤشر ترابط ، وحدد موقع تنزيل البداية والنهاية لكل مؤشر ترابط وفقًا لحجم الملف وعدد مؤشرات الترابط التي تم تنزيلها بواسطة كل مؤشر ترابط.
(4) من أجل إدراك وظيفة تنزيل نقطة الإيقاف ، من الضروري وضع علامة على موقع تنزيل الوقت الفعلي لكل موضوع لتسهيل تنزيل التقدم في البداية القادمة.
Open 3 Thread Download Views (دليل التنزيل الافتراضي هو مشروع ضمن Java):
رمز التنفيذ الإجمالي هو كما يلي (لا يزال هناك مجال كبير للتحسين ، لذلك لا تنظر إليه فقط وقد تم ذلك)
استيراد java.io.bufferedreader Static Final String Path = "http://soft3.xzstatic.com/2015/10/hsjj2ghgzh.rar" ؛ public static int threadcount = 0 ؛ // إعلان عدد المواضيع الرئيسية الفراغ الثابتة (string [] args) {try {url url = new url (path) ؛ // احصل على اتصال httpurlConnection conn = (httpurlConnection) url.openconnection () ؛ // تحديد اسم الملف عن طريق الحصول على سلسلة الاتصال [] str = path.split ("/") ؛ اسم ملف السلسلة = str [5] ؛ // احصل على حجم ملف التنزيل int fileLength = conn.getContentLength () ؛ system.out.println (اسم الملف) ؛ // قم بإنشاء ملف مكتوب عشوائيًا يتماشى مع حجم الخادم RandomAccessFile RAF = جديد عشوائي Accessfile (اسم الملف ، "RWD") ؛ System.out.println (Filelength) ؛ // test raf.setLength (filelength) ؛ // Custom Thread Count threadCount = 3 ؛ // احسب حجم البيانات التي تم تنزيلها بواسطة كل مؤشر ترابط int int = fileLength / threadCount ؛ . = طول fileL. } مؤشر ترابط جديد (جديد تحميل (ThreadId ، StartPos ، Endpos ، path)) .start () ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }} // تنفيذ مؤشر ترابط التنزيل static class sladloadthread تنفذ RunNable {private int threadID ؛ Private Int StartPos ؛ Private Int Endpos ؛ مسار السلسلة الخاص public downloadTraptRead (int threadID ، int startPos ، int endpos ، string path) {super () ؛ this.throadid = threadId ؛ this.startpos = startPos ؛ this.endpos = endpos ؛ this.path = path ؛ } public void run () {try {url url = new url (path) ؛ String [] str = path.split ("/") ؛ اسم ملف السلسلة = str [5] ؛ httpurlConnection conn = (httpurlConnection) url .OpenConnection () ؛ // قم بتعيين طريقة طلب URL (راجع API للحصول على التفاصيل) Conn.SetRequestMethod ("get") ؛ // تعيين 500 مللي ثانية كقيمة المهلة conn.setReadTimeout (5000) ؛ ملف الملف = ملف جديد (ThreadId + ".txt") ؛ if (file.exists () && file.length ()> 0) {bufferedReader br = new BufferEdReader (new inputStreamReader (fileInputStream جديد (ملف))) ؛ String SavesTartPos = br.readline () ؛ if (savestartpos! = null && savestartpos.length ()> 0) {startPos = integer.parseint (savestartpos) ؛ }} // انتبه إلى التنسيق في عروض أسعار مزدوجة ، ولا يمكن أن يحتوي على مسافات (مثل الأحرف الأخرى) ، وإلا يتم الإبلاغ عن 416. Conn.SetRequestProperty ("Range" ، "Bytes =" + StartPos + "-" + Endpos) ؛ RandomAccessfile raf = new RandomAccessFile (اسم الملف ، "RWD") ؛ // تخزين ملف الكتابة العشوائية إلى ملف التنزيل raf.seek (startPos) ؛ // قم بتعيين الموقع لبدء تنزيل system.out.println ("Thread" + ThreadId + ":" + startPos + "~~" inputStream هو = conn.getInputStream () ؛ Byte [] B = New Byte [1024 * 1024 * 10] ؛ int len = -1 ؛ int newPos = StartPos ؛ بينما ((len = iS.Read (b))! = -1) {RandomAccessFile rr = new RandomAccessFile (file ، "rwd") ؛ // تم تخزين ملف تنزيل tag raf.write (b ، 0 ، len) ؛ // احفظ علامة التنزيل إلى سلسلة المستندات المحددة savapoint = string.valueof (newPos += LEN) ؛ rr.write (savapoint.getBytes ()) ؛ rr.close () ؛ } is.close () ؛ raf.close () ؛ System.out.println ("Download Complete") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}ملحوظات:
(1) فهم طريقة الحساب للمواضع البدء والنهاية لكل تنزيل مؤشر ترابط (لا يشمل مؤشر ترابط آخر ، ابدأ من 0)
موقف البدء = (عدد مؤشرات الترابط - 1) * طول (حجم) الملف المراد تنزيله بواسطة كل مؤشر ترابط
الموضع النهائي = (عدد مؤشرات الترابط * حجم الملف الذي تم تنزيله بواسطة كل مؤشر ترابط) -1
(2) موضع بدء التنزيل الذي تم تعيينه بواسطة مؤشر الترابط الأخير هو الموضع النهائي للمعلومات السابقة ، والموقف النهائي هو طول الملف.
لذلك ، لن يكون طول الملف الذي تم تنزيله بواسطة مؤشر الترابط الأخير هو نفسه الخيط السابق
(3) مسار تنزيل هذا العرض التوضيحي هو الدليل الذي يقع فيه مشروع Java افتراضيًا ، ولا يمكن للدليل أن يحتوي على ملفات تحمل نفس اسم الملف الذي تم تنزيله ، وإلا فإن البرنامج سيبلغ عن خطأ في طلب شبكة 416.
(4) خطأ ارتكبته في تنفيذ conn.setRequestProperty ("Range" ، "Bytes ="+StartPos+"-"+Endpos) ؛ تأكد من ملاحظة أن الاقتباسات لا تحتوي بالضرورة على مساحات إضافية وشخصيات أخرى. لدي فقط مساحة في عروض الأسعار ، لكن وضع الأخطاء كان دائمًا خطأً في الإدخال ، ومن المؤلم للغاية العثور على الأخطاء الخاطئة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.