يهدف RMNP إلى الجمع بين جميع مزايا TCP وسرعة UDP لكي يكون سريعًا بما يكفي لدعم الألعاب الحديثة في الوقت الفعلي مثل ألعاب إطلاق النار من منظور الشخص الأول. وهو في الأساس امتداد لـ UDP.
الشيء السيئ في TCP هو أنه بمجرد إسقاط الحزمة فإنه يتوقف عن إرسال كافة الحزم الأخرى حتى يتم تسليم الحزمة المفقودة. يمكن أن يمثل هذا مشكلة كبيرة للألعاب الحساسة للوقت لأنه ليس من غير المألوف أن تواجه الأجهزة فقدان الحزم. ولذلك فإن RMNP يسهل UDP لضمان التسليم السريع دون أي قيود. نظرًا لأن UDP عديم الحالة، يقوم RMNP بتنفيذ طريقة سهلة للتعامل مع الاتصال والتمييز بين العملاء "المتصلين". تحتوي كل حزمة على رأس صغير يحتوي بشكل أساسي على تجزئة CRC32 لضمان إرسال جميع الحزم المستلمة بشكل صحيح.
ولضمان الموثوقية، يرسل جهاز الاستقبال حزم الإقرار مرة أخرى لإخبار المرسل بالحزم التي استلمها. يقوم المرسل بإعادة إرسال كل حزمة حتى يتلقى إقرارًا أو يتم الوصول إلى الحد الأقصى للمهلة. وبسبب ذلك فإن RMNP ليس موثوقًا بنسبة 100% ولكن يمكن الافتراض أنه سيتم تسليم الحزمة ما لم يتعرض العميل لفقدان الحزمة بنسبة 100% تقريبًا لبضع ثوانٍ.
go get github.com/obsilp/rmnp
مثال خادم بونغ
package main
import "github.com/obsilp/rmnp"
func main () {
server := rmnp . NewServer ( ":10001" )
server . Start () // non-blocking
// other code ...
}
مثال عميل Ping
package main
import "github.com/obsilp/rmnp"
func main () {
client := rmnp . NewClient ( "127.0.0.1:10001" )
client . Connect () // non-blocking
// other code ...
}
يمكن تلقي الأحداث والحزم المستلمة عن طريق تعيين عمليات الاسترجاعات. انظر إلى الفصول المعنية لمزيد من المعلومات.
عمليات الاسترجاعات العميل | عمليات الاسترجاعات الخادم
هذا المشروع مرخص بموجب ترخيص MIT - راجع ملف الترخيص للحصول على التفاصيل