سؤال

لدي بضعة أسئلة بخصوص تورنت بروتوكول الأسلاك الأقران.أنا أحاول أن تنفيذ ذلك في جافا باستخدام هذه المواصفات.

في بروتوكول الأسلاك الأقران قسم يقول أن جميع الأعداد الصحيحة هي أربعة بايت big endian القيم.AFAIK جافا الاستخدامات big endian.هل هذا يعني أن أقول إذا كنت تريد إرسال رسالة الاختناق

الاختناق:<len=0001><id=0>

هل أنا فقط أكتب إلى sokcet 1 متبوعا 0?

أما عن السؤال الثاني.عند طلب قطعة لا أعتقد ملفات متعددة واحدة كبيرة المستمر الملف ؟ أو التفكير في كل الملفات ؟ لأن قطعة طول لا تتماشى مع الملفات حتى مؤشر واحد يمكن أن تحتوي كل منهما على نهاية ملف واحد و بداية آخر ؟

أما السؤال الأخير عندما فتح اتصال إلى الأقران و إرسال المصافحة هل أستمر طلب القطع أو طلب ثم الانتظار لفترة من الوقت لمعرفة ما اذا كان سوف يطلب شيء منا ؟ كيف يتحدث ؟ لدي الغالب يتم http نوع شبكة البرمجة حيث كنت تسأل عن شيء انتظر الرد.ولكن إذا أستمر في طلب القطع كيف أنا ذاهب لإرسال القطع ؟

هل كانت مفيدة؟

المحلول

السؤال 1

وإصرارها على أساليب بسيطة, إذا كنت تستخدم تيار القائم على I/O ثم استخدام DataInputStream و DataOutputStream عند كتابة بدائية أنواع (على سبيل المثال ، بايت, الباحث, طويلة, إلخ.):

Socket s; // assume this is already connected
DataOutputStream out = new DataOutputStream( s.getOutputStream );
out.writeByte( 1 );
out.writeInt( 0 );
out.flush(); // optional

إذا كنت تستخدم غير مؤمن (I/O على سبيل المثالدروس من جافا.nio حزمة) ثم استخدام ByteBuffer s:

Socket s; // assume this is already connected
SocketChannel = s.getChannel();
ByteBuffer buf = ByteBuffer.allocate(8); // two 4-byte integers
buf.put( 1 ).putInt( 0 );
buf.flip();
c.write( buf ); // assuming channel is writable :)

كل من هذه الأساليب سوف تأخذ الرعاية من البايت يأمر القضايا نيابة عنك.

السؤال 2

(لاحظ أنه عادة ما يتم نقل كتل, التي هي أجزاء من القطع على السلك.سوف يتستر على ذلك هنا :) )

عند إرسال/تلقي قطعة انه من الأفضل أن نفكر من الملفات (أو الملف) كما مستمر كما قلت.على .ملف تورنت يحتوي على معلومات حول ملف الحدود في معلومات القاموس.في متعددة ملف القضية, كل ملف يحتوي المسار على طول ؛ على واحد ملف القضية اختياري اسم والطول.منذ كنت تعرف قطعة حجم عدد القطع إجمالي طول المحتوى (كل من .ملف التورنت) ، يمكنك وضع القطع "في المكان المناسب" كما يمكنك الحصول عليها.

شيء بسيط القيام به هو إنشاء ملف واحد يساوي حجم التورنت.عندما تتلقى قطعة ، الكتابة الصحيحة إزاحة البايت ضمن هذا ملف واحد (يسمى أحيانا ".تحميل الملف").على سبيل المثال النظر في سيل تتكون من ملفين:

a/b/file1.txt [100 bytes]
a/b/file2.txt [200 bytes]

piece size (pz) = 50 bytes
total size (tz) = 100+200 = 300 bytes
number pieces (np) = 300/50 = 6
file = my_torrent.downloading

نفترض أننا عدد القطع بايت إزاحة بدءا من الصفر.نقول تتلقى كل قطعة 1.في (بداية) إزاحة البايت أنها لا تذهب في my_torrent.تحميل ؟ فإنه يذهب في (1*pz) = (1*50) = 50.أين قطعة 0 تذهب ؟ في (0*pz) = (0*50) = 0.وهلم جرا...

أراهن أن الآن يمكنك معرفة كيفية تشغيل هذا .تحميل الملف إلى "ريال مدريد" المحتوى داخل سيل.

السؤال 3

عند المشاركة في تورنت سرب, تحميل وتنزيل القطع من عدة أقرانهم في وقت واحد .التفكير في أن واحد عن الثاني.في نفس الوقت كنت تطلب قطعة من بعض الأقران آخر الأقران يمكن أن تفعل نفس منك.مختلفة تماما عن دلالات HTTP كما أشرنا من قبل.لذا التحدث مباشرة على سؤالك ، أقرانهم الآخرين سوف يطلب منك بيانات أنهم مهتمون.:)

فقط للتأكد, قبل أن يمكنك طلب قطعة من نظير تأكد من أن الأقران لديه قطعة تريد (راجع bitfield و الرسائل) و لقد احترمت السليم الاختناق/مهتم السلوك.نظرا لأنه عادة ما تحتاج إلى القيام به هو طلب البيانات من قائمة معروفة من أقرانهم (أن تعقب أو DHT أخبرتك عنه) في أندر الأولى النظام.المواصفات يتحدث عن هذا و هناك الكثير من التحسينات و المداراة الاعتبارات هنا.(الثأر السلوك ، على سبيل المثال.) قد تلاحظ أن المواصفات لا توضيح الكثير من هذا.ذلك لأن الكثير من الخلطة السرية تورنت العملاء تكمن في هذا الجزء من التنفيذ.:)

آمل أن يكون هذا يساعدك على بعض!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top