مكتبة WebSocket Gorilla للغة Go (Golang) — دليل كامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مكتبة Gorilla WebSocket للغة Go (Golang)



Gorilla WebSocket هي واحدة من أشهر وأكثر المكتبات استقرارًا للعمل مع بروتوكول WebSocket في لغة Go (Golang). وهي جزء من نظام Gorilla Toolkit البيئي، وتوفر للمطورين أداة قوية ومرنة وعالية الأداء لإنشاء تطبيقات الوقت الفعلي: الدردشات، الإشعارات الفورية، الألعاب عبر الإنترنت، لوحات المراقبة، وغيرها الكثير.



تنفذ المكتبة بالكامل مواصفات RFC 6455، وتدعم كلاً من جانب الخادم والعميل، كما تعالج تلقائيًا تجزئة الرسائل، وآليات ping/pong، والتحكم في الاتصال. تمت كتابة Gorilla WebSocket بلغة Go النقية دون أي تبعيات خارجية، مما يجعلها خفيفة وسريعة.



الميزات الرئيسية

  • دعم كامل لبروتوكول WebSocket (RFC 6455).
  • واجهة برمجة تطبيقات بسيطة وبديهية.
  • دعم الرسائل النصية والثنائية.
  • إدارة تلقائية لـ ping/pong للحفاظ على الاتصال.
  • إمكانية التحقق من مصدر الطلب (Origin).
  • دعم ضغط الرسائل (permessage-deflate).
  • العمل مع TLS/HTTPS.
  • أداء عالٍ واستهلاك منخفض للذاكرة.


التثبيت

لتثبيت المكتبة، قم بتنفيذ الأمر التالي:

go get github.com/gorilla/websocket

بعد ذلك، قم باستيراد الحزمة في الكود الخاص بك:

import "github.com/gorilla/websocket"


مثال لخادم WebSocket بلغة Go

فيما يلي خادم بسيط يستقبل اتصالات WebSocket ويعيد إرسال الرسائل المستلمة (خادم الصدى):



package main

import ( "fmt" "log" "net/http"

"github.com/gorilla/websocket")

var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // السماح بجميع المصادر (للتطوير) },}

func echoHandler(w http.ResponseWriter, r *http.Request) { // إنشاء اتصال WebSocket conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("خطأ في الترقية:", err) return } defer conn.Close()

// حلقة لا نهائية لقراءة الرسائل for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("خطأ في القراءة:", err) break } log.Printf("تم استلام رسالة: %s", message)

// إعادة إرسال الرسالة err = conn.WriteMessage(messageType, message) if err != nil { log.Println("خطأ في الكتابة:", err) break } }}

func main() { http.HandleFunc("/echo", echoHandler) fmt.Println("الخادم قيد التشغيل على :8080") log.Fatal(http.ListenAndServe(":8080", nil))}


عميل WebSocket بلغة Go

مثال لعميل بسيط يتصل بالخادم ويرسل رسالة:



package main

import ( "fmt" "log" "net/url"

"github.com/gorilla/websocket")

func main() { u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/echo"} fmt.Printf("جارٍ الاتصال بـ %s", u.String())

conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { log.Fatal("خطأ في الاتصال:", err) } defer conn.Close()

// إرسال رسالة نصية err = conn.WriteMessage(websocket.TextMessage, []byte("مرحبًا، WebSocket!")) if err != nil { log.Fatal("خطأ في الإرسال:", err) }

// قراءة الرد _, message, err := conn.ReadMessage() if err != nil { log.Fatal("خطأ في القراءة:", err) } fmt.Printf("تم استلام الرد: %s", message)}


العمل مع عدة عملاء (broadcast)

لإنشاء دردشة أو نظام إشعارات، غالبًا ما يكون من الضروري بث الرسائل

توصيات