0Pricing
Go Academy · Lección

Gestión de conexiones

Gestione las desconexiones

Gestión de conexiones es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Las conexiones no duran para siempre

Los clientes cierran pestañas, pierden la conexión Wi-Fi o se bloquean. Los servidores WebSocket robustos deben detectar las desconexiones, liberar recursos y finalizar las goroutines. De lo contrario, se filtran memoria y sockets.

El handshake de cierre

Un cierre limpio envía una trama de cierre en ambas direcciones. gorilla lo presenta como un error de ReadMessage con un código de cierre que puede inspeccionar.

if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
    // graceful close
}

Keepalive con Ping/Pong

Para detectar una conexión semia-bierta (cuando el par desaparece sin cerrar la conexión), el servidor envía periódicamente tramas de control ping y espera respuestas pong.

conn.SetPongHandler(func(string) error {
    conn.SetReadDeadline(time.Now().Add(60 * time.Second))
    return nil
})

Límites de tiempo de lectura

Establezca un límite de tiempo de lectura para que un par inactivo termine generando un error en lugar de bloquearse indefinidamente. Actualícelo cada vez que llegue un pong.

conn.SetReadDeadline(time.Now().Add(60 * time.Second))

El ticker de ping

Un ticker de la goroutine de escritura activa pings periódicos. Si una escritura falla, la conexión está inactiva y se sale.

ticker := time.NewTicker(54 * time.Second)
defer ticker.Stop()
for range ticker.C {
    if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
        return
    }
}

Limpieza al salir

Cuando termina un bucle de lectura o escritura, dé de baja al cliente y cierre la conexión. defer hace que esto sea fiable incluso en caso de panic.

defer func() {
    hub.unregister <- client
    conn.Close()
}()

Dos goroutines por conexión

El patrón estándar ejecuta un readPump y un writePump por conexión. Cuando uno detecta un error, activa la limpieza que detiene al otro (a menudo cerrando el canal send).

También límites de tiempo de escritura

Establezca límites de tiempo de escritura para que una escritura bloqueada no mantenga una goroutine bloqueada indefinidamente. Una escritura cuyo tiempo se agota devuelve un error y se desmantela la conexión.

conn.SetWriteDeadline(time.Now().Add(10 * time.Second))

Cierre ordenado del servidor

Al cerrar el servidor, envíe a cada cliente una trama de cierre y espere brevemente. Combínelo con http.Server.Shutdown y un límite de tiempo del contexto.

conn.WriteMessage(websocket.CloseMessage,
    websocket.FormatCloseMessage(websocket.CloseGoingAway, "bye"))

Reconexión del cliente

Las desconexiones son normales. Los clientes deben implementar una lógica de reconexión con retroceso exponencial. En el servidor solo es necesario gestionar correctamente cada conexión y desconexión.

Ejecutable: analogía de la detección mediante tiempo de espera

El keepalive de WebSocket necesita la biblioteca; este programa de la biblioteca estándar modela una comprobación de actividad basada en un límite de tiempo, un temporizador y un canal.

package main

import (
    "fmt"
    "time"
)

func main() {
    pong := make(chan struct{})
    go func() {
        time.Sleep(20 * time.Millisecond) // simulate a slow/absent peer
        _ = pong                          // no pong sent -> dead connection
    }()
    select {
    case <-pong:
        fmt.Println("alive")
    case <-time.After(10 * time.Millisecond):
        fmt.Println("no pong: closing dead connection")
    }
}

Comprobación rápida

Compruebe su comprensión de la gestión de conexiones.

Resumen

Ha aprendido a gestionar conexiones:

  • Gestione el handshake de cierre e inspeccione los códigos de cierre
  • Utilice ping/pong junto con límites de tiempo de lectura y escritura para detectar pares inactivos
  • Ejecute readPump y writePump; realice la limpieza con defer
  • Cierre el servidor ordenadamente con tramas de cierre; los clientes se reconectan con retroceso

Preguntas frecuentes

¿La lección «Gestión de conexiones» es gratis?

Sí — el texto completo de «Gestión de conexiones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Gestión de conexiones»?

Gestione las desconexiones Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Gestión de conexiones»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos básicos de WebSocket
  2. Uso de gorilla/websocket
  3. Difusión de mensajes
  4. Gestión de conexiones
← Volver a Go Academy