التواصل ثنائي الاتجاه مع مقبس واحد - كيفية التعامل مع التصادم؟

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

سؤال

لدي تطبيق واحد. يتكون من "المدير" و "العامل". حاليًا ، يبدأ العامل دائمًا الاتصال ، ويقول شيئًا للمدير ، وسيقوم المدير بإرسال الرد.

نظرًا لوجود الكثير من التواصل بين المدير والعامل ، فإنني أفكر في فتح مقبس بين الاثنين والقيام بالاتصال. آمل أيضًا أن أبدأ التفاعل من كلا الجانبين - مما أتاح للمدير أن يقول شيئًا للعامل متى أرادت.

ومع ذلك ، أنا في حيرة من أمري حول كيفية التعامل مع "الاصطدام". على سبيل المثال ، يقرر المدير قول شيء للعامل ، وفي الوقت نفسه يقرر العامل قول شيء للمدير. ماذا سيحدث؟ كيف ينبغي التعامل مع هذا الموقف؟

ملاحظة: أخطط لاستخدام NetTy للتنفيذ الفعلي.

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

المحلول

"آمل أيضًا أن أبدأ التفاعل من كلا الجانبين - تمكين المدير من قول شيء للعامل كلما أراد."

إجابة بسيطة. لا.

تعلم من البروتوكولات الحالية: لديك عميل وخادم. الأمور ستعمل بشكل جيد. يمكن أن يكون العامل هو الخادم ويمكن للمدير أن يكون عميلًا. يمكن للمدير تقديم العديد من الطلبات. يستجيب العامل للطلبات عند وصولها.

يمكن أن يكون نظير إلى نظير معقدًا بدون قيمة حقيقية للتعقيد.

نصائح أخرى

سأذهب لقناة ثنائية الاتجاه مستمرة بين الخادم والعميل.

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

الآن ، إذا كان لديك العديد من العملاء ويحتاج الخادم الخاص بك إلى إرسال طلب على وجه التحديد إلى Client X ، فأنت بحاجة المصافحة!

عند حذاء العميل ، يتصل بالخادم. بمجرد إنشاء هذا الاتصال ، يعرّف العميل نفسه بأنه عميل X (رسالة المصافحة). يعلم الخادم الآن أنه يحتوي على مقبس مفتوح للعميل X وفي كل مرة يحتاج إلى إرسال رسالة إلى Client X ، فإنه يعيد استخدام هذا المقبس.

محظوظ لك ، لقد كتبت للتو برنامجًا تعليميًا (تم تضمين عينة من المشروع) حول هذه المشكلة الدقيقة. باستخدام Netty! قون

إليك الرابط: http://bruno.linker45.eu/2010/07/15/handshaking-tutorial-with-netty/

لاحظ أنه في هذا الحل ، الخادم لا محاولة الاتصال بالعميل. إنه دائمًا العميل الذي يتصل بالخادم. إذا كنت تفكر في فتح مأخذ توصيل في كل مرة تريد إرسال رسالة ، فيجب عليك إعادة النظر في اتصالات مستمرة لأنها تتجنب النفقات العامة لإنشاء الاتصال ، وبالتالي تسريع معدل نقل البيانات n-fold.

أعتقد أنك بحاجة إلى قراءة المقابس ....

لا تحصل حقًا على هذه الأنواع من المشكلات .... بخلاف كيفية التعامل مع الاستلام والإرسال بشكل استجابة ، يتم ذلك بشكل عام من خلال ربط اتصالاتك ... اعتمادًا على التطبيق ، يمكنك اتباع عدد من الأساليب إلى هذا.

الرابط الصحيح للمصافحة/Netty Tutorial المذكورة في استجابة Brunodecarvalho http://bruno.factor45.org/blag/2010/07/15/handshaking-tutorial-with-netty/
أود أن أضيف هذا كتعليق على سؤاله ولكن ليس لدي الحد الأدنى من السمعة المطلوبة للقيام بذلك.

إذا كنت ترغب في إعادة اختراع العجلة ولا تريد استخدام الوسيطة ...

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

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