WebSocket على Go: بناء تطبيقات الوقت الفعلي من الصفر

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

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

ابدأ الدورة

WebSocket بلغة Go: بناء تطبيقات الزمن الحقيقي



تتطلب تطبيقات الويب الحديثة بشكل متزايد نقلًا فوريًا للبيانات بين العميل والخادم. لا تناسب طلبات HTTP التقليدية بدورة "الطلب-الاستجابة" المهام التي تعتمد على السرعة: الدردشات الفورية، أسعار الأسهم، الألعاب متعددة اللاعبين، أو الإشعارات في الوقت الفعلي. هنا يأتي دور WebSocket، وهو بروتوكول يوفر اتصالًا ثنائي الاتجاه دائمًا. في هذه المقالة، سنشرح كيفية تنفيذ WebSocket بلغة Go (Golang)، بدءًا من الخادم الأساسي وصولًا إلى تطبيق زمن حقيقي متكامل.



ما هو WebSocket ولماذا Go؟



WebSocket هو بروتوكول يعمل فوق TCP، يسمح بإنشاء اتصال دائم بين العميل (المتصفح) والخادم. بعد المصافحة (handshake)، يتم نقل البيانات في كلا الاتجاهين دون الحاجة إلى رؤوس HTTP إضافية، مما يقلل بشكل كبير من زمن الاستجابة.



لماذا Go؟ لغة Go مثالية لخوادم WebSocket بفضل دعمها المدمج للتوازي (الغوروتينات والقنوات)، والأداء العالي، وسهولة كتابة كود الشبكات. على عكس Node.js، لا تحتاج Go إلى حلقات أحداث خارجية، وطبيعتها المترجمة تمنحها ميزة في السرعة.



خادم WebSocket أساسي بلغة Go



للعمل مع WebSocket في Go، سنستخدم المكتبة الشهيرة gorilla/websocket. وهي توفر واجهة برمجة تطبيقات مريحة وتتعامل مع تفاصيل البروتوكول.



قم بتثبيت المكتبة:

go get github.com/gorilla/websocket


الآن سنكتب خادم صدى (echo) بسيطًا يعيد إرسال كل ما يستقبله من العميل.



package main

import ( "log" "net/http" "github.com/gorilla/websocket")

var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // للتطوير. في الإنتاج، تحقق من Origin. },}

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("/ws", echoHandler) log.Println("الخادم يعمل على المنفذ :8080") log.Fatal(http.ListenAndServe(":8080", nil))}


شرح الكود:

  • Upgrader — كائن يقوم "برفع" اتصال HTTP إلى WebSocket.
  • CheckOrigin — دالة للتحقق من مصدر الطلب. في الإنتاج، يجب تكوينها بشكل صحيح.
  • conn.ReadMessage() و conn.WriteMessage() — الطرق الأساسية لقراءة/كتابة الرسائل.
  • حلقة for تبقي الاتصال مفتوحًا حتى حدوث خطأ.


بنية دردشة الزمن الحقيقي عبر WebSocket



خادم الصدى هو الأساس، لكن لتطبيق الزمن الحقيقي، مثل الدردشة، نحتاج إلى منطق أكثر تعقيدًا. دعنا نلقي نظرة على بنية حيث يمكن لعدة عملاء تبادل الرسائل عبر الخادم.



المكونات الأساسية:

  • Hub — مدير مركزي يخزن قائمة الاتصالات النشطة.
  • Client — هيكل يمثل اتصال WebSocket واحدًا.
  • القنوات (channels) — لنقل البيانات بأمان بين الغوروتينات.


package main

import ( "log" "net/http" "github.com/gorilla/websocket")

var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true },}

// Clien

المدونات

توصيات الكتب