0Pricing
Go Academy · درس

إدارة الاتصالات

عالج حالات قطع الاتصال

إدارة الاتصالات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

الاتصالات لا تدوم إلى الأبد

قد يغلق العملاء علامات التبويب أو يفقدوا اتصال Wi-Fi أو تتعطل أجهزتهم. يجب على خوادم WebSocket المتينة اكتشاف حالات الانقطاع وتنظيف الموارد وتحرير goroutines. وإلا فستتسرّب الذاكرة والمقابس.

مصافحة الإغلاق

يرسل الإيقاف المنظّم إطار إغلاق في كلا الاتجاهين. وتعرض gorilla ذلك على شكل خطأ من ReadMessage يتضمن رمز إغلاق يمكنك فحصه.

if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
    // graceful close
}

إبقاء الاتصال حيًا باستخدام Ping/Pong

لاكتشاف اتصال نصف مفتوح (اختفاء الطرف الآخر من دون إغلاق)، يرسل الخادم دوريًا إطارات تحكم ping ويتوقع ردود pong.

conn.SetPongHandler(func(string) error {
    conn.SetReadDeadline(time.Now().Add(60 * time.Second))
    return nil
})

مهل القراءة

اضبط مهلة قراءة حتى يتسبب الطرف الآخر المتوقف في حدوث خطأ في النهاية بدلًا من استمرار الحجب إلى الأبد. وجدّد المهلة عند وصول كل pong.

conn.SetReadDeadline(time.Now().Add(60 * time.Second))

مؤقت Ping

يطلق ticker داخل goroutine الكاتب إشارات ping دورية. وإذا فشلت الكتابة، يكون الاتصال قد انقطع، فتخرج من التنفيذ.

ticker := time.NewTicker(54 * time.Second)
defer ticker.Stop()
for range ticker.C {
    if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
        return
    }
}

التنظيف عند الخروج

عند انتهاء حلقة القراءة أو الكتابة، ألغِ تسجيل العميل وأغلق الاتصال. تجعل defer هذه العملية موثوقة حتى عند حدوث panic.

defer func() {
    hub.unregister <- client
    conn.Close()
}()

Goroutineان لكل اتصال

يشغّل النمط القياسي readPump وwritePump لكل اتصال. وعندما تكتشف إحداهما خطأً، تطلق عملية تنظيف توقف الأخرى (غالبًا بإغلاق قناة send).

مهل الكتابة أيضًا

اضبط مهل الكتابة حتى لا تؤدي كتابة عالقة إلى إبقاء goroutine متوقفة إلى الأبد. تعيد الكتابة التي تجاوزت المهلة خطأً، وعندها تنهي الاتصال.

conn.SetWriteDeadline(time.Now().Add(10 * time.Second))

إيقاف الخادم بسلاسة

عند إيقاف الخادم، أرسل إلى كل عميل إطار إغلاق وانتظر قليلًا. ادمج ذلك مع http.Server.Shutdown ومع مهلة سياق.

conn.WriteMessage(websocket.CloseMessage,
    websocket.FormatCloseMessage(websocket.CloseGoingAway, "bye"))

إعادة الاتصال لدى العميل

حالات الانقطاع طبيعية. ينبغي للعملاء تطبيق منطق إعادة اتصال باستخدام التراجع الأُسّي. أما جانب الخادم، فما عليه سوى معالجة كل اتصال وانقطاع اتصال بطريقة سليمة.

قابل للتشغيل: تشبيه اكتشاف انتهاء المهلة

تحتاج آلية إبقاء اتصال WebSocket حيًا إلى المكتبة؛ ويحاكي هذا البرنامج باستخدام المكتبة القياسية فحصًا لحيوية الاتصال قائمًا على مهلة، مع مؤقت وقناة.

package main

import (
    "fmt"
    "time"
)

func main() {
    pong := make(chan struct{})
    go func() {
        time.Sleep(20 * time.Millisecond) // simulate a slow/absent peer
        _ = pong                          // no pong sent -> dead connection
    }()
    select {
    case <-pong:
        fmt.Println("alive")
    case <-time.After(10 * time.Millisecond):
        fmt.Println("no pong: closing dead connection")
    }
}

تحقق سريع

اختبر مدى فهمك لإدارة الاتصالات.

مراجعة

لقد تعلمت إدارة الاتصالات:

  • عالج مصافحة الإغلاق وافحص رموز الإغلاق
  • استخدم ping/pong مع مهل القراءة والكتابة لاكتشاف الأطراف المتوقفة
  • شغّل مضختَي القراءة والكتابة؛ ونظّف الموارد باستخدام defer
  • أوقف الخادم بسلاسة باستخدام إطارات الإغلاق؛ ويعيد العملاء الاتصال مع التراجع

الأسئلة الشائعة

هل درس «إدارة الاتصالات» مجاني؟

نعم — نص درس «إدارة الاتصالات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «إدارة الاتصالات»؟

عالج حالات قطع الاتصال تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «إدارة الاتصالات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

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

جميع الدروس في هذه الدورة

  1. أساسيات WebSocket
  2. استخدام gorilla/websocket
  3. بث الرسائل
  4. إدارة الاتصالات
← العودة إلى Go Academy