سؤال

أقوم ببناء نظام دردشة بسيط بين العميل والخادم.

يرسل العملاء البيانات إلى الخادم ويقوم الخادم بإعادة إرسال البيانات إلى جميع العملاء الآخرين.أنا أستخدم فئات دفق TcpListener والشبكة لإرسال البيانات بين العميل والخادم.

الحقول التي أحتاج إلى إرسالها هي، على سبيل المثال:الاسم والنص والطابع الزمني وما إلى ذلك.أقوم بفصلهم باستخدام حرف ASCII 29.

أنا أيضًا أستخدم حرف ASCII 30 لتحديد نهاية البيانات المتدفقة.

يتم ترميز البيانات بـ UTF8.

هذا هو نهج جيد؟هل سأواجه مشاكل؟هل هناك طرق أفضل؟

تحديث:

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

  • باستخدام العلامات
  • استخدام حرف كمحدد
  • استخدام طول ثابت لكل الحقول
هل كانت مفيدة؟

المحلول

بدلاً من تحديد النص، أجده كثيراً من الأسهل وضع بادئة طويلة للرسائل الفردية - بدلاً من الكتابة

message [TERMINATOR]

كنت أكتب

[LENGTH] message

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

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

بالمناسبة، UTF-8 هو التشفير, وليست خوارزمية تشفير.

نصائح أخرى

أظن أنه يمكن أن يكون هناك خيار آخر لتسلسل/إزالة الكائنات الخاصة بك وإرسالها/استلامها باستخدام .NET Remoting. يمكنك أيضًا تشفير كائناتك عند الإرسال وفك تشفيرها عند الاستلام.

في مشروع الرمز لقد وجدت مثالًا صغيرًا مع رمز المصدر.

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