ما هي أفضل طريقة لمراقبة مأخذ لبيانات جديدة ومن ثم معالجة تلك البيانات؟

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

سؤال

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

وأنا أعمل على تطبيق من شأنها أن تقبل اتصال مأخذ توصيل TCP من تطبيق جافا. (نعم، مطلوب جافا على هذا الجزء. انها وسيلة الشمس SPOT وجافا هو الخيار الوحيد.) التطبيق جافا سيتم دوريا كتابة البيانات الجديدة إلى مأخذ، وعملي التطبيق هو أن تأخذ في البايت []، وتحويل إلى سلسلة، عملية البيانات (UI التحديث، الخ)، وربما إلى الأمام البيانات إلى كمبيوتر آخر يشغل التطبيق مشابه C # .NET.

وهنا هو ما قمت به حتى الآن: الآن التطبيق يدور فوق موضوع على الإطلاق أن يفتح مأخذ. التطبيق جافا يمكن الاتصال بنجاح إلى مقبس بحيث يعمل. كنت أبحث في طريقة لNetworkStream في beginRead وdataAvailable، length، وخصائص CanRead، لكنني لست متأكدا تماما كيفية التأكد عندما قرأت حزمة واحدة من البيانات، وعادة حوالي 512 بايت ولكن يمكن أن تختلف.

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

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

وشكرا للقراءة ولأي مساعدة يمكن أن تقدم.

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

المحلول 3

والطريقة التي قد تحل بذلك هو أن تكون مزيجا من الحروف الحارس وحقول عرض ثابت. وحدتي بايت الأولى هي رأس طول الحزمة بأكملها. ثم قرأت الحزمة إلى [] بايت العازلة ومن ثم الاعتماد على بنيتنا حزمة الخاص لمعرفة ذلك، على سبيل المثال، وحدتي بايت الأولى هي كل لأن تفسر على أنها الحقول الفردية ومن ثم يتم إنهاء حقول السلسلة مع الطابع \ ن (0x0A إذا كنت مسجلا في المنزل). ثم، تتم معالجة حقول البيانات طويلة من خلال قراءة في 8 بايت على التوالي، وما إلى ذلك يبدو أن تعمل بشكل جيد جدا بالنسبة لنا، ولكن من الواضح أن الحل لهذه الحالة حيث يتعين على المرء السيطرة على طرفي المقبس وليس مكان واحد فقط قادرة على السيطرة على نهاية واحدة. آمل أن يساعد هذا شخص آخر أيضا.

نصائح أخرى

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

ويجب الحرص على عدم نفترض أن لديك أي سيطرة على ما ينتهي بيانات تصل فيه الحزمة. إذا حاولت إرسال البيانات بايت { 'H', 'e', 'l', 'l', 'o' } ليس هناك ما يضمن أن سيتم إرسال جميع هذه البيانات في حزمة واحدة. في حين انه من غير المحتمل جدا أنه لا يزال من الممكن أن كل حزمة يمكن أن تحتوي فقط بايت واحد لذلك كنت الحصول على جميع بايت خمسة في 5 مناسبات مختلفة. والنقطة، لا تعتمد على الحزم بهذه الطريقة. بدلا من ذلك، تحديد نهاية الخاص بك من الإنهاء رسالة وببساطة إرم كافة البيانات الواردة إلى منطقة عازلة بايت من نوع ولها وظيفة أخرى قادمة في الكشف عن ما إذا كان هناك أي من هذه النهايات الحالية. إذا كان الأمر كذلك قراءة ما يصل إلى أن فاصل. لذلك نقول على سبيل المثال استدعاء الأسلوب إرسال المعنية من تطبيق جافا مرتين يحتوي على البيانات التالية:

{ 'H', 'e', 'l', 'l', 'o', '\0' }
{ 'W', 'o', 'r', 'l', 'd', '\0' }

وكيف طلبك يجب أن يكون مستعدا لتلقي يجب أن تكون البيانات شيئا من هذا القبيل:

Server receives { 'H', 'e', 'l' }
Data stored in byte buffer { 'H', 'e', 'l' }
Check byte buffer for message terminator '\0'. None found. Buffer unchanged, no message processed.
Server receives { 'l', 'o', '\0', 'W' }
Data stored in byte buffer { 'H', 'e', 'l', 'l', 'o', '\0', 'W' }
Check byte buffer for message terminator '\0'. 1 found, extracted message { 'H', 'e', 'l', 'l', 'o' } and buffer updated { 'W' }

وذلك في الوقت الذي لم يكن بالضبط إجابة على سؤالك الأصلي أعتقد أنه يجب أن تعطيك دفعة في الاتجاه الصحيح.

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

عند كنت تقرأ تدفق البيانات التي تحتاجها بعض الحارس / إنهاء حرف أو حجم معروفة من البيانات لتحديد متى تتوقف القراءة ومعالجة المعلومات. أحرف فارغة أو أسطر جديدة شائعة. أسلوب آخر يستخدم رأس حجم ثابت الذي يحدد طول الجسم.

ومقبس ستظل مفتوحة حتى تقوم بإغلاقه أو إنهاء الجانب الآخر، وفي هذه الحالة سوف تحصل على خطأ أثناء القراءة من مأخذ، والتي shuold التعامل معها. NetworkStream يطرح IOException عندما تم إغلاق مأخذ التوصيل من الجانب البعيد أثناء قراءة أو الكتابة العملية.

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