أفضل طريقة للقيام بالاتصال بين المقطعين على نظام التشغيل Mac OS X

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

سؤال

أنا أتطلع إلى بناء تطبيق الكاكاو على جهاز Mac مع عملية خفية خلفية (في الحقيقة مجرد تطبيق الكاكاو الذي لا يتجاهل في الغالب ، على الأرجح) ، إلى جانب تطبيقات "العميل" أو أكثر مثل دعم العملاء عن بُعد أيضًا ؛ لن يكون العملاء عن بُعد فقط أجهزة Macs أو iPhone OS).

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

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

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

أنا متأكد من أن هناك أشياء أفتقدها ، لكنني فوجئت بإيجاد نقص الموارد في هذا الموضوع.

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

المحلول

أنا أبحث حاليًا في نفس الأسئلة. بالنسبة لي ، فإن إمكانية إضافة عملاء Windows في وقت لاحق تجعل الموقف أكثر تعقيدًا ؛ في حالتك ، يبدو أن الإجابة أكثر بساطة.

حول الخيارات التي فكرت فيها:

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

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

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

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

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

    في تجربتي ، فإن سهولة الانتقال إلى أنظمة مختلفة وحتى لغات البرمجة) جيدة جدًا لأن أي شيء متوافق عن بُعد لأعمال Posix.

    [تعديل: على وجه الخصوص ، بمجرد توصيل الأرقام الثنائية ، تصبح Endianess مشكلة وعليك العناية بهذه المشكلة يدويًا - هذه حالة شائعة (!) الخاصة بمشكلة "المعلومات الصحيحة" التي ذكرتها أعلاه. سوف يعضك على سبيل المثال عندما يكون لديك PowerPC يتحدث إلى Intel Mac. هذه الحالة الخاصة تختفي مع الحل 3.+4. ستعمل معا جميع قضايا "المعلومات الصحيحة" الأخرى.

  3. +4. الكائنات الموزعة: ال NSProxy يتم استخدام مجموعة الفئة لتنفيذ الكائنات الموزعة. NSConnection مسؤول عن إعداد الاتصالات عن بُعد كشرط أساسي لإرسال المعلومات حولها ، لذلك بمجرد أن تفهم كيفية استخدام هذا النظام ، فإنك تفهم أيضًا الكائنات الموزعة. ؛^)

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

    هناك مقدمة مع مثالين صريحين في خادم مشروع Gnustep ؛ يوضح كيف تعمل التكنولوجيا وهي نقطة انطلاق جيدة للتجربة:http://www.gnustep.org/resources/documentation/developer/base/programmingmanual/manual_7.html

    لسوء الحظ ، فإن العيوب هي خسارة تامة للتوافق (على الرغم من أنك ستظل على ما يرام مع الإعداد الذي ذكرته من Macs و iPhone/iPad فقط) مع أنظمة أخرى وفقدان قابلية النقل إلى لغات أخرى. إن Gnustep مع Objective-C في أحسن الأحوال متوافقة مع الكود ، ولكن لا توجد وسيلة للتواصل بين Gnustep و Cocoa ، انظر تحرير بلدي إلى السؤال رقم 2 هنا: Corba على Mac OS X (الكاكاو)

    [تعديل: لقد صادفت للتو معلومات أخرى لم أكن على دراية بها. بينما راجعت ذلك NSProxy متوفر على iPhone ، لم أتحقق مما إذا كانت الأجزاء الأخرى من آلية الكائنات الموزعة. وفقا لهذا الرابط: http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html (ابحث في الصفحة عن عبارة "iPhone OS") ليست كذلك. هذا من شأنه أن يستبعد هذا الحل إذا طلبت استخدام iPhone/iPad في هذه اللحظة.

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

نصائح أخرى

عدم اعطاء رأي: الكائنات الموزعة هي غير متوفر على iPhone.


لماذا تجد الكائنات الموزعة inelegant؟ يبدو وكأنه مباراة جيدة هنا:

  • تنظيم شفاف للأنواع الأساسية وفئات الهدف-C
  • لا يهم حقًا أن العملاء محليين أو عن بعد
  • ليس الكثير من العمل الإضافي للتطبيقات القائمة على الكاكاو

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

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

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