مكتبة 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)
لإنشاء دردشة أو نظام إشعارات، غالبًا ما يكون من الضروري بث الرسائل