هل يرى NetworkStream.DataAvailable البيانات المخزنة مؤقتًا؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل يعرف NetworkStream.DataAvailable ما إذا كان المخزن المؤقت للإرسال الخاص بالمرسل فارغًا؟أم أنها تشير ببساطة إلى ما إذا كان المخزن المؤقت للقراءة الخاص بالمستقبل يحتوي على بيانات؟ظني ​​هو الأخير..

على وجه التحديد، بالنسبة لبعض أعمال المقبس التي تتضمن محادثة مستمرة، أستخدم حاليًا بادئة الطول حتى يعرف المتلقي بالضبط مقدار البيانات الموجودة في الدفعة الحالية؛ومع ذلك، فقد تم إرسال ملف تصحيح يقترح علي استخدام NetworkStream.DataAvailable بدلاً من ذلك.ما يقلقني هو أن هذا سيخبرني فقط بما حصل عليه المتلقي - وليس ما أرسله المرسل في الأصل - لكنني لست خبيرًا في المقابس.

هل انا مخطئ؟أم أن بادئة الطول هي الطريق الصحيح؟

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

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

المحلول

لن يعرف أحد جانبي الاتصال ما إذا كان مخزن الإرسال المؤقت للجانب الآخر فارغًا.

DataAvailable يشير فقط إلى ما إذا كانت هناك بيانات واردة ليتم قراءتها.يمكنك استخدام ذلك قبل Read(), ، لكنه وحده لا يوفر لك المعلومات التي تريدها.ولا يخبرك ببداية ونهاية كل دفعة.

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

البديل الوحيد لقيم طول الدُفعة في الدفق هو طريقة ما لفحص البيانات الواردة والتعرف على بدايات ونهايات الدُفعات.

نصائح أخرى

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

عادةً ما أقوم بتعريف بنية مشابهة لهذه التي تظهر في مقدمة أي رسائل ثنائية أرسلها.

struct Header
{
  int packetIdentifier;
  int protocolVersion;
  int messageType;
  int payloadSize;
}

يتيح لك المعرف تحديد ما إذا كان لديك رسالة صالحة من نوع البروتوكول الخاص بك.يتيح لك الإصدار مراجعة البروتوكول الخاص بك.نوع الرسالة هو نوع الرسالة (أي:كومس أون لاين).حجم الحمولة هو حجم نص الرسالة.

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