Gorilla WebSocket: una herramienta potente para tiempo real en Go
En el desarrollo web moderno, la necesidad de intercambiar datos en tiempo real es cada vez más relevante. Ya sea para chats, juegos en línea, monitoreo de servidores o cotizaciones bursátiles — WebSocket es el estándar de facto para la comunicación bidireccional entre cliente y servidor. Para el lenguaje Go (Golang), una de las bibliotecas más populares y estables para trabajar con WebSocket es Gorilla WebSocket.
La biblioteca gorilla/websocket forma parte del ecosistema Gorilla Toolkit, un conjunto de paquetes de alta calidad para desarrollo web en Go. Proporciona un conjunto completo de funciones para crear servidores y clientes WebSocket, soporta todos los protocolos principales (RFC 6455) y se caracteriza por su facilidad de uso.
Características principales de Gorilla WebSocket
- Soporte completo del protocolo WebSocket — trabajo con tramas de texto y binarias, fragmentación de mensajes, tramas de control (ping/pong).
- API conveniente — interfaz minimalista con las funciones
ReadMessageyWriteMessage. - Soporte TLS/SSL — conexiones WebSocket seguras (wss://).
- Configuración flexible — posibilidad de establecer tiempos de espera, tamaños de búfer, verificar el origen de las solicitudes.
- Compatibilidad con HTTP — se integra fácilmente con cualquier servidor HTTP de Go (net/http).
- Trabajo con contextos — soporte para
context.Contextpara la cancelación de operaciones.
Instalación de la biblioteca
Para instalar Gorilla WebSocket, ejecute el comando en la terminal:
go get github.com/gorilla/websocketDespués de esto, agregue la importación en su archivo Go:
import "github.com/gorilla/websocket"Ejemplo básico de un servidor WebSocket
Consideremos un servidor echo muy simple que acepta conexiones WebSocket y envía de vuelta los mensajes recibidos.
package main
import ( "log" "net/http"
"github.com/gorilla/websocket")
var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // Permitimos todos los orígenes (para desarrollo) },}
func echoHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("Upgrade failed:", err) return } defer conn.Close()
for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("Read error:", err) break } log.Printf("Received: %s", message)
if err := conn.WriteMessage(messageType, message); err != nil { log.Println("Write error:", err) break } }}
func main() { http.HandleFunc("/echo", echoHandler) log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", nil))}Explicación detallada del código
- Upgrader — es una estructura que transforma una solicitud HTTP normal en una conexión WebSocket. En el ejemplo, permitimos solicitudes desde cualquier origen (campo
CheckOrigin). En producción, se deben verificar dominios específicos. - Upgrade — el método principal que toma
http.ResponseWritery*http.Requesty devuelve*websocket.Conn. - ReadMessage — una llamada bloqueante que espera un nuevo mensaje del cliente. Devuelve el tipo de mensaje (texto o datos binarios) y los datos en sí.
- WriteMessage — envía un mensaje de vuelta al cliente. En este caso, simplemente devolvemos lo mismo que recibimos.
Cliente WebSocket (Gorilla)
La biblioteca también permite