From 803347234aee7c18b19d0b130643db90e981a28d Mon Sep 17 00:00:00 2001 From: ichandrasharma Date: Tue, 21 Jan 2025 16:03:49 +0530 Subject: [PATCH] implement websocket gorilla/websocket library --- backend/cmd/server/main.go | 9 +++- backend/cmd/server/webscoket.go | 92 +++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 backend/cmd/server/webscoket.go diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index dcd28af..438dcdb 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -9,6 +9,7 @@ import ( "net/http" "regexp" + "log" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" @@ -189,8 +190,12 @@ func server() { } func main(){ - // server(); - StartWebSocketServer(); + // Initialize the WebSocket hub + hub := NewChatHub() + go hub.Start() + + // WebSocket route for handling connections + router.GET("/ws", WebSocketHandler(hub)) } func helloWorld(ctx *gin.Context){ diff --git a/backend/cmd/server/webscoket.go b/backend/cmd/server/webscoket.go new file mode 100644 index 0000000..a88a537 --- /dev/null +++ b/backend/cmd/server/webscoket.go @@ -0,0 +1,92 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "github.com/gorilla/websocket" + "github.com/gin-gonic/gin" +) + +// WebSocket upgrader to handle the WebSocket connection +var upgrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + // Allow all origins + return true + }, +} + +// ChatHub stores active WebSocket connections +type ChatHub struct { + clients map[*websocket.Conn]bool + broadcast chan []byte + register chan *websocket.Conn + unregister chan *websocket.Conn +} + +// NewChatHub creates a new ChatHub instance +func NewChatHub() *ChatHub { + return &ChatHub{ + clients: make(map[*websocket.Conn]bool), + broadcast: make(chan []byte), + register: make(chan *websocket.Conn), + unregister: make(chan *websocket.Conn), + } +} + +// Start the hub to listen for events (new connections, messages, etc.) +func (hub *ChatHub) Start() { + for { + select { + case conn := <-hub.register: + hub.clients[conn] = true + fmt.Println("New client connected") + + case conn := <-hub.unregister: + if _, ok := hub.clients[conn]; ok { + delete(hub.clients, conn) + conn.Close() + fmt.Println("Client disconnected") + } + + case message := <-hub.broadcast: + for client := range hub.clients { + err := client.WriteMessage(websocket.TextMessage, message) + if err != nil { + fmt.Println("Error broadcasting message:", err) + client.Close() + delete(hub.clients, client) + } + } + } + } +} + +// WebSocketHandler handles WebSocket connections and message reception +func WebSocketHandler(hub *ChatHub) gin.HandlerFunc { + return func(c *gin.Context) { + // Upgrade the HTTP connection to a WebSocket connection + conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + log.Println("WebSocket upgrade failed:", err) + return + } + + // Register the new connection in the hub + hub.register <- conn + defer func() { + hub.unregister <- conn + }() + + // Handle incoming messages from the WebSocket client + for { + _, message, err := conn.ReadMessage() + if err != nil { + fmt.Println("Error reading message:", err) + break + } + // Broadcast the received message to all connected clients + hub.broadcast <- message + } + } +}