هل يمكن لـ Java ServerSocket و Sockets باستخدام ObjectIoStreams أن تفقد الحزم؟

StackOverflow https://stackoverflow.com/questions/2719253

سؤال

أنا أستخدم Serversocket على الخادم والمآخذ التي تستخدم ObjectIoStreams لإرسال كائنات قابلة للتسلسل عبر اتصال الشبكة. أقوم بتطوير نسخة مالية أكثر من الاحتكار ، وبالتالي يتم إرسال الحزم وتأكيدها كما هو مطلوب/تم استلامها. هل أحتاج إلى تنفيذ مراقب فقدان الحزم الخاص بي أم أن ذلك قد تم الاعتناء به بالفعل باستخدام مآخذ (خادم)؟

أنا أسأل في المقام الأول عن فقدان الحزم أثناء شباك الشبكة أو غير ذلك ، وليس خطأ في الاتصال الكامل. على سبيل المثال ، يتحرك الأشقاء لوحة الرصاص بين جهاز التوجيه الخاص بي ومحول Wi-Fi للكمبيوتر.

http://code.google.com/p/inequity/source/browse/#svn/trunk/src/networkيمكن العثور على الكود ضمن الشبكة-> ClientController و Network-> Server

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

المحلول

نظريا؛ نعم. لا توجد طريقة لإعطاء ضمان نظري بنسبة 100 ٪ بأن ما يتم إرساله على طبقة الأجهزة ، يتم استلامه بنفس الطريقة في الطرف المتلقي.

ومع ذلك ، إذا كنت تستخدم TCP (بروتوكول التحكم في النقل) ، فقد تم بالفعل العناية بهذه الأشياء ؛ لن تفقد أي حزم. (إذا كنت تستخدم UDP من ناحية أخرى (بروتوكول بيانات المستخدم) ، فهذه قصة أخرى ، وقد يكون الأمر جيدًا جدًا أنك تفقد الحزم أو تلقيها خارج الترتيب).

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

أعتقد أن أفضل طريقة لحل المزامنة هي وضع حلقة الشبكة في حلقة صغيرة جدًا للقراءة/المزامنة ، والتقاط الحزم المستلمة من قائمة الانتظار كلما كنت متأكدًا من عدم وجود مؤشر ترابط آخر تدخل.

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