Skip to main content

Creating and Using WebSocket Connections in Go

· 3 min read
PSVNL SAI KUMAR
SDE @ Intralinks

Overview

WebSockets provide a way to open a persistent connection between a client and server, allowing for real-time communication. In Go, the github.com/gorilla/websocket package is commonly used to work with WebSockets. This guide will help you set up and use WebSocket connections in your Go application.

Prerequisites

Ensure you have the following before you begin:

  • Go installed on your system
  • Basic knowledge of Go programming
  • An understanding of WebSocket concepts

Installing the Gorilla WebSocket Package

First, you'll need to install the Gorilla WebSocket package. Open your terminal and run:

go get -u github.com/gorilla/websocket
package main

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

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

func handleConnection(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Error while upgrading connection:", err)
return
}
defer conn.Close()

for {
messageType, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Error while reading message:", err)
break
}
log.Printf("Received message: %s", msg)

err = conn.WriteMessage(messageType, msg)
if err != nil {
log.Println("Error while writing message:", err)
break
}
}
}

func main() {
http.HandleFunc("/ws", handleConnection)
serverAddr := "localhost:8080"
log.Printf("WebSocket server started at ws://%s", serverAddr)
log.Fatal(http.ListenAndServe(serverAddr, nil))
}

Setting up the client

package main

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

func main() {
serverAddr := "ws://localhost:8080/ws"
conn, _, err := websocket.DefaultDialer.Dial(serverAddr, nil)
if err != nil {
log.Fatal("Error while connecting to WebSocket server:", err)
}
defer conn.Close()

err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, WebSocket!"))
if err != nil {
log.Println("Error while sending message:", err)
}

_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Error while reading message:", err)
}
log.Printf("Received message: %s", msg)
}

Handling Errors

Make sure to handle errors properly in both the server and client to ensure reliable communication.

Additional Features

Broadcasting Messages: To send messages to multiple clients, you’ll need to manage a list of connections and iterate through them to broadcast. Ping/Pong: To keep connections alive and check their status, use the Ping and Pong methods provided by the websocket package. Authentication: Implement authentication mechanisms as needed to secure your WebSocket connections. Conclusion Using WebSocket connections in Go is straightforward with the Gorilla WebSocket package. This guide covers basic setup and usage, but you can extend it to handle more complex scenarios as needed.

For more detailed documentation, refer to the Gorilla WebSocket documentation.