سؤال

أحاول كتابة خادم اقتراع طويل القائم على TCP مخصص سيكون بمثابة الحصول على اتصالات TCP الأخرى التي تتطلب المزيد من الثبات من الهاتف المحمول يمكن أن توفر.

الطريقة التي أحاول القيام بها هي كتابة خادم TCP غير متزامن في C # وعميل TCP مطابقة مكتوب أيضا في C #.

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

هذا هو المكان الذي تأتي فيه مشكلتي. لا يمكنني معرفة كيفية "ربط" طلب موكلتي للبيانات مع معالج الأحداث التي تعمل على الخادم ...

يجب أن يكون التدفق شيئا مثل هذا ("العميل" على هاتف):

  1. المستخدم يبدأ طلبي

  2. يرسل العميل طلبا يتم إخطاره إذا تغيرت البيانات

  3. خادم "روابط" (سجلات) كائن المقبس في العميل في "معالج الأحداث" يسمى بواسطة اتصالات TCP الأخرى الخادم التي تحدثت عنها!

  4. هدف

    إذا تم تشغيله (قد وصلت بيانات جديدة)، أرسل البيانات إلى العميل

    o إذا لم يتم تشغيلها (لا توجد بيانات جديدة)، فقم بإرسال حزمة "playchanges" للعميل

  5. يتلقى العميل بيانات على الهاتف ويعالجه (يستدعي معالج الأحداث استنادا إلى نوع الحزمة التي تلقاها ويمر "البيانات" التي حصلت عليها من الخادم إليها)

  6. يرسل العميل طلبا يتم إخطاره إذا تغيرت البيانات

لذلك، فإن مشكلتي هي أنني لا أستطيع التفكير في التصميم الذي سيجلب ما أريده القيام به. المشكلة هي أنني لا أعرف كيفية القيام # 3. كيف يمكنني "ربط" حدث حدث واحد من آخر؟ وهذه مضمونة تقريبا لتشغيل المواضيع المختلفة!

لذلك، سيبدو طلبي شيء مثل هذا (كل psuedocode):

Class AppClass
{
    Main()

    List<Client> clients;
    List<DataServers> dataServers;

    DataReceivedFromServer(Data stuff)
    {
    }

    MessageReceivedFromPhone(PhoneMessage pm, object sender)
    {
        //Loop here until HeartBeat interval reached
        Int totalTime = 0;
        While(totalTime < HEARTBEAT_INTERVAL)
        {
            If( ) // If we have received data from the server, and the client WANTED that data, send it now
            {
            }
        }
    }
}

نوعا من؟ أريد أن أكون حماة مدفوعة، لكنني أمتلك الوقت الضرر في معرفة كيفية قيادة الطلب باستخدام نمط دفع مدفوع مقابل ما أنا "مستعمل" ل Polling.

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

منصة الخادم: ويندوز

لغة الخادم: C #

اختبار منصة العميل: ويندوز

اختبار لغة الاختبار: C #

منصة العميل المستهدفة: Windows Mobile 6.5، iPhone، Android (سيتم كتابة العملاء بشكل منفصل)

لغة العميل المستهدفة: C #، OBJ-C أو Monotouch، Java

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

المحلول

فقط أي شخص يتساءل هذا، لقد تكتب فكرة كتابة خادم TCP مخصص لإدارة اتصالاتي. كان هناك الكثير من النفقات العامة في القيام بذلك، سأكون أساسا تكرار في كتابة خادم HTTP الخاص بي، لذلك بدلا من القيام بذلك، ذهبت مع إطار Web Tornado في Python كخاددي واكتب خدمات النهاية الخلفية للتواصل عبر HTTP الطلبات في اعصار الويب.

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

في الأساس، يعمل إطار Web Tornado بمثابة حافلة للمؤسسات في الهندسة المعمارية الخاصة بي.

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