0Pricing
Go Academy · درس

استخدام gorilla/websocket

رقِّ الاتصالات وعالجها

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

مكتبة gorilla/websocket

تُعد gorilla/websocket مكتبة WebSocket الأكثر استخدامًا في Go. فهي تتولى مصافحة الترقية وتمنحك كائن اتصال لقراءة الإطارات وكتابتها. ثبّتها باستخدام go get github.com/gorilla/websocket.

import "github.com/gorilla/websocket"

أداة Upgrader

تحوّل Upgrader طلب HTTP إلى اتصال WebSocket. ويمكنك ضبط أحجام المخازن المؤقتة والتحقق من المصدر.

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

CheckOrigin والأمان

ترفض Upgrader افتراضيًا الطلبات الواردة من مصادر مختلفة. يمكنك تخفيف هذا القيد أثناء التطوير، لكن تحقّق في بيئة الإنتاج من ترويسة Origin لمنع اختطاف WebSocket من مواقع أخرى.

upgrader.CheckOrigin = func(r *http.Request) bool {
    return r.Header.Get("Origin") == "https://myapp.com"
}

إجراء الترقية داخل Handler

استدعِ Upgrade داخل http.HandlerFunc. عند النجاح، تحصل على *websocket.Conn.

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        return
    }
    defer conn.Close()
    // read/write loop here
}

قراءة الرسائل

تحجب ReadMessage التنفيذ حتى وصول إطار، ثم تعيد نوع الرسالة وبايتات الحمولة.

mt, data, err := conn.ReadMessage()
if err != nil {
    return // client closed or error
}
fmt.Printf("got %d bytes\n", len(data))
_ = mt

كتابة الرسائل

ترسل WriteMessage إطارًا من نوع محدد:

err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
if err != nil {
    return
}

حلقة الصدى

يقرأ المثال الكلاسيكي رسالة ثم يكتبها مرة أخرى. تنتهي الحلقة عندما تعيد Read خطأً (أي عندما ينقطع اتصال العميل).

for {
    mt, msg, err := conn.ReadMessage()
    if err != nil {
        break
    }
    conn.WriteMessage(mt, msg)
}

أدوات JSON المساعدة

توفر gorilla الدالتين ReadJSON وWriteJSON لترميز قيم Go مباشرة عبر المقبس، وهو أمر مفيد للرسائل المنظّمة. ويحمل حقل البنية Msg الوسم json:"text" في المصدر الفعلي.

type Msg struct {
    Text string // tag: json text
}
var m Msg
conn.ReadJSON(&m)
conn.WriteJSON(Msg{Text: "ack"})

قاعدة قارئ واحد وكاتب واحد

مهم: لا يسمح الاتصال الواحد إلا بقارئ متزامن واحد وكاتب متزامن واحد. إذا كتبت عدة goroutines، فاحمِ الكتابة باستخدام mutex أو مرّرها عبر goroutine واحدة (وسنتناول ذلك في درس البث).

تسجيل المسار

اربط المعالج كما تفعل مع أي مسار HTTP. يتصل العملاء بالعنوان ws://host/ws.

http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8080", nil)

قابل للتشغيل: تشبيه ذهاب الرسالة وإيابها بتنسيق JSON

يحتاج كود WebSocket إلى المكتبة الخارجية؛ يطابق هذا المقطع باستخدام المكتبة القياسية سلوكَي ReadJSON وWriteJSON، إذ يفكّ ترميز رسالة واردة إلى خريطة ثم يرمّز ردًا.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    in := []byte("{\"text\":\"ping\"}")
    var m map[string]string
    json.Unmarshal(in, &m)
    reply, _ := json.Marshal(map[string]string{"text": m["text"] + "-ack"})
    fmt.Println(string(reply))
}

تحقق سريع

اختبر مدى فهمك لاستخدام gorilla/websocket.

مراجعة

لقد تعلمت استخدام gorilla/websocket:

  • تنفّذ Upgrader المصافحة؛ تحقّق من CheckOrigin
  • تعيد Upgrade قيمة من النوع *websocket.Conn
  • استخدم ReadMessage وWriteMessage أو الأدوات المساعدة الخاصة بـ JSON
  • استخدم قارئًا واحدًا وكاتبًا واحدًا لكل اتصال في الوقت نفسه

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

هل درس «استخدام gorilla/websocket» مجاني؟

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

ماذا ستتعلم في «استخدام gorilla/websocket»؟

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

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

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

كم من الوقت يستغرق درس «استخدام gorilla/websocket»؟

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

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

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

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

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