Go (Golang) WebSocket लाइब्रेरी: gorilla/websocket और मानक net/http
\n\nWebSocket एक प्रोटोकॉल है जो एकल लंबे समय तक चलने वाले TCP कनेक्शन पर क्लाइंट और सर्वर के बीच पूर्ण-द्वैध संचार प्रदान करता है। क्लासिक HTTP के विपरीत, कनेक्शन स्थापित होने के बाद, क्लाइंट से लगातार अनुरोधों के बिना, किसी भी समय डेटा दोनों दिशाओं में प्रेषित किया जा सकता है। यह चैट, रियल-टाइम सूचनाओं, ऑनलाइन गेम और ट्रेडिंग प्लेटफॉर्म के लिए एक आदर्श समाधान है।
\n\nGo (Golang) इकोसिस्टम में WebSocket के साथ काम करने के कई तरीके हैं। सबसे लोकप्रिय और समय-परीक्षित लाइब्रेरी gorilla/websocket है। हालाँकि, Go 1.22 से शुरू होकर, मानक net/http पैकेज का उपयोग करके, तीसरे पक्ष की निर्भरता के बिना एक बुनियादी WebSocket सर्वर को लागू करना संभव हो गया है। इस लेख में, हम दोनों दृष्टिकोणों पर विस्तार से चर्चा करेंगे।
gorilla/websocket लाइब्रेरी की स्थापना
\n\ngorilla/websocket के साथ काम शुरू करने के लिए, इसे go get के माध्यम से स्थापित करें:
\n\ngo get github.com/gorilla/websocket\n\nलाइब्रेरी सर्वर और क्लाइंट दोनों पक्षों को बनाने के लिए एक सुविधाजनक API प्रदान करती है। यह हैंडशेक, संदेश फ्रेमिंग को संभालती है, संपीड़न और स्वचालित पिंग/पोंग का समर्थन करती है।
\n\ngorilla/websocket पर WebSocket सर्वर
\n\nएक सरल इको सर्वर का उदाहरण देखें। क्लाइंट एक संदेश भेजता है, सर्वर उसे वापस भेजता है:
\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 failed:", err)\n return\n }\n defer conn.Close()\n\n for {\n messageType, message, err := conn.ReadMessage()\n if err != nil {\n log.Println("Read error:", err)\n break\n }\n log.Printf("Received: %s", message)\n\n if err := conn.WriteMessage(messageType, message); err != nil {\n log.Println("Write error:", err)\n break\n }\n }\n}\n\nfunc main() {\n http.HandleFunc("/echo", echoHandler)\n log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\nयहाँ Upgrader एक सामान्य HTTP अनुरोध को WebSocket कनेक्शन में बदल देता है। CheckOrigin फ़ंक्शन नियंत्रित करता है कि किन डोमेन से कनेक्शन की अनुमति है। उत्पादन में, विशिष्ट स्रोतों की जाँच करने की अनुशंसा की जाती है।
gorilla/websocket पर WebSocket क्लाइंट
\n\nएक क्लाइंट का उदाहरण जो हमारे सर्वर से जुड़ता है और एक संदेश भेजता है:
\n\npackage main\n\nimport (\n "log"\n "os"\n "os/signal"\n "time"\n "github.com/gorilla/websocket"\n)\n\nfunc main() {\n interrupt := make(chan os.Signal, 1)\n signal.Notify(interrupt, os.Interrupt)\n\n url := "ws://localhost:8080/echo"\n c, _, err := websocket.DefaultDialer.Dial(url, nil)\n if err != nil {\n log.Fatal("dial:", err)\n }\n defer c.Close()\n\n done := make(chan struct{})\n\n // उत्तर पढ़ने के लिए गोरूटीन\n go func() {\n defer close(done)\n for {\n _, message, err := c.ReadMessage()\n if err != nil {\n log.Println("read:", err)\n return\n }\n log.Printf("recv: %s", message)\n }\n }()\n\n // संदेश भेजना\n ticker := time.NewTicker(time.Second)\n defer ticker.Stop()\n\n for {\n select {\n case <-done:\n return\n case t := <-ticker.C:\n err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))\n if err != nil {\n log.Println("write:", err)\n return\n }\n case <-interrupt:\n log