Gorilla WebSocket: أداة قوية للوقت الفعلي على Go
في تطوير الويب الحديث، تزداد الحاجة إلى تبادل البيانات في الوقت الفعلي بشكل متزايد. سواء كانت الدردشات، الألعاب عبر الإنترنت، مراقبة الخوادم أو أسعار البورصة — فإن WebSocket هو المعيار الفعلي للاتصال ثنائي الاتجاه بين العميل والخادم. بالنسبة للغة Go (Golang)، واحدة من أشهر وأكثر المكتبات استقرارًا للعمل مع WebSocket هي Gorilla WebSocket.
مكتبة gorilla/websocket هي جزء من نظام Gorilla Toolkit — مجموعة من الحزم عالية الجودة لتطوير الويب على Go. توفر مجموعة كاملة من الوظائف لإنشاء خوادم وعملاء WebSocket، وتدعم جميع البروتوكولات الرئيسية (RFC 6455) وتتميز بسهولة الاستخدام.
الميزات الرئيسية لـ Gorilla WebSocket
- دعم كامل لبروتوكول WebSocket — العمل مع الإطارات النصية والثنائية، تجزئة الرسائل، إطارات التحكم (ping/pong).
- واجهة برمجة تطبيقات مريحة — واجهة بسيطة مع دوال
ReadMessageوWriteMessage. - دعم TLS/SSL — اتصالات WebSocket آمنة (wss://).
- إعدادات مرنة — إمكانية تحديد المهلات الزمنية، أحجام المخازن المؤقتة، التحقق من مصدر الطلبات.
- التوافق مع HTTP — يتكامل بسهولة مع أي خادم HTTP في Go (net/http).
- العمل مع السياقات — دعم
context.Contextلإلغاء العمليات.
تثبيت المكتبة
لتثبيت Gorilla WebSocket، قم بتنفيذ الأمر في الطرفية:
go get github.com/gorilla/websocketبعد ذلك، أضف الاستيراد إلى ملف Go الخاص بك:
import "github.com/gorilla/websocket"مثال أساسي لخادم WebSocket
لننظر إلى خادم صدى بسيط، يستقبل اتصالات WebSocket ويعيد إرسال الرسائل المستلمة.
package main
import ( "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) { 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)
if err := conn.WriteMessage(messageType, message); err != nil { log.Println("خطأ في الكتابة:", err) break } }}
func main() { http.HandleFunc("/echo", echoHandler) log.Println("تم بدء الخادم على المنفذ :8080") log.Fatal(http.ListenAndServe(":8080", nil))}شرح تفصيلي للكود
- Upgrader — هيكل يحول طلب HTTP عادي إلى اتصال WebSocket. في المثال، نسمح بالطلبات من أي مصدر (حقل
CheckOrigin). في الإنتاج، يجب التحقق من النطاقات المحددة. - Upgrade — الطريقة الرئيسية التي تأخذ
http.ResponseWriterو*http.Requestوتعيد*websocket.Conn. - ReadMessage — استدعاء حظر ينتظر رسالة جديدة من العميل. يعيد نوع الرسالة (نص أو بيانات ثنائية) والبيانات نفسها.
- WriteMessage — يرسل رسالة مرة أخرى إلى العميل. في هذه الحالة، نعيد ببساطة نفس ما تلقيناه.
عميل WebSocket (Gorilla)
تسمح المكتبة أيضًا