Go पर WebSocket का परिचय: real-time क्यों?
\n\nआधुनिक वेब एप्लिकेशनों को तेजी से डेटा डिलीवरी की आवश्यकता होती है। पारंपरिक HTTP अनुरोध/प्रतिक्रिया चैट, ऑनलाइन गेम, स्टॉक कोट्स और मॉनिटरिंग पैनल के कार्यों के लिए पर्याप्त नहीं है। यहाँ WebSocket मदद करता है — एक प्रोटोकॉल जो क्लाइंट और सर्वर के बीच स्थायी द्विदिश कनेक्शन प्रदान करता है। इस लेख में, हम सीखेंगे कि Go (Golang) पर WebSocket का उपयोग करके real-time एप्लिकेशन कैसे बनाएं, इंस्टॉलेशन से लेकर प्रोडक्शन समाधान तक।
\n\nGo अपनी हल्की कंकरेंसी मॉडल (गोरूटीन) और उच्च प्रदर्शन के कारण WebSocket के लिए आदर्श है। हम एक साधारण इको सर्वर से लेकर पूर्ण चैट और मॉनिटरिंग सिस्टम तक का सफर तय करेंगे।
\n\nWebSocket की मूल बातें और वातावरण सेटअप
\n\nWebSocket क्या है?
\nWebSocket एक प्रोटोकॉल है जो TCP पर काम करता है। यह HTTP हैंडशेक (अपग्रेड) से शुरू होता है, जिसके बाद कनेक्शन एक स्थायी द्विदिश चैनल में बदल जाता है। HTTP के विपरीत, सर्वर बिना अनुरोध के क्लाइंट को डेटा भेज सकता है — यही real-time का आधार है।
\n\nइंस्टॉलेशन और लाइब्रेरीज़
\nGo में WebSocket के लिए कोई मानक लाइब्रेरी नहीं है, लेकिन एक लोकप्रिय लाइब्रेरी gorilla/websocket है। इसे इंस्टॉल करें:
go get github.com/gorilla/websocket\n\nआप nhooyr.io/websocket (एक अधिक आधुनिक विकल्प) का भी उपयोग कर सकते हैं, लेकिन इस लेख में हम सबसे सामान्य gorilla पर ध्यान केंद्रित करेंगे।
Go पर पहला WebSocket सर्वर
\nहम एक सरल इको सर्वर लिखेंगे जो संदेश प्राप्त करता है और उसे वापस भेजता है:
\npackage main\n\nimport (\n "log"\n "net/http"\n "github.com/gorilla/websocket"\n)\n\nvar upgrader = websocket.Upgrader{\n CheckOrigin: func(r *http.Request) bool {\n return true // डेवलपमेंट के लिए\n },\n}\n\nfunc echoHandler(w http.ResponseWriter, r *http.Request) {\n conn, err := upgrader.Upgrade(w, r, nil)\n if err != nil {\n log.Print("Upgrade:", err)\n return\n }\n defer conn.Close()\n\n for {\n mt, message, err := conn.ReadMessage()\n if err != nil {\n log.Println("Read:", err)\n break\n }\n log.Printf("Received: %s", message)\n err = conn.WriteMessage(mt, message)\n if err != nil {\n log.Println("Write:", err)\n break\n }\n }\n}\n\nfunc main() {\n http.HandleFunc("/echo", echoHandler)\n log.Println("Server started on :8080")\n log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\nयह एक न्यूनतम कार्यशील उदाहरण है। Upgrader पर ध्यान दें — यह HTTP हेडर की जाँच करता है और कनेक्शन को स्विच करता है।
real-time एप्लिकेशन की आर्किटेक्चर: Go पर चैट
\n\nकनेक्शन प्रबंधन
\nचैट के लिए कई क्लाइंट्स को प्रबंधित करना आवश्यक है। हम एक Hub संरचना बनाएंगे जो सभी सक्रिय कनेक्शनों को संग्रहीत करेगी और संदेशों को प्रसारित करेगी:
type Client struct {\n hub *Hub\n conn *websocket.Conn\n send chan []byte\n}\n\ntype Hub struct {\n clients map[*Client]bool\n broadcast chan []byte\n register chan *Client\n unregister chan *Client\n}\n\nfunc newHub() *Hub {\n return &Hub{\n clients: make(map[*Client]bool),\n broadcast: make(chan []byte),\n register: make(chan *Client),\n unregister: make(chan *Client),\n }\n}\n\nfunc (h *Hub) run() {\n for {\n select {\n case client := <-h.register:\n h.clients[client] = true\n case client := <-h.unregister:\n if _, ok := h.clients[client]; ok {\n delete(h.clients, client)\n close(client.send)\n }\n case message := <-h.broadcast:\n for client := range h.clients {\n select {\n case client.send <- message:\n default:\n