Socket API Reference¶
El tipo Socket es el cliente principal que maneja la conexión con el servidor Socket.IO.
Tabla de Contenidos¶
- Creación
- Métodos de Conexión
- Métodos de Eventos
- Métodos de Emisión
- Métodos de Estado
- Métodos de Configuración
Creación¶
New¶
Crea una nueva instancia de Socket y establece la conexión con el servidor.
Parámetros: - rawURL (string): URL del servidor Socket.IO. Puede usar el esquema ws:// o http:// (se convertirá automáticamente a WebSocket) - options (Options, opcional): Configuración del cliente
Retorna: - *Socket: Instancia del cliente
Ejemplo:
// Conexión básica
client := socketio.New("ws://localhost:3000")
// Con opciones
client := socketio.New("ws://localhost:3000", socketio.Options{
Auth: map[string]interface{}{
"token": "abc123",
},
ReconnectAttempts: 5,
Timeout: 30 * time.Second,
})
Métodos de Conexión¶
Close¶
Cierra la conexión con el servidor y libera todos los recursos.
Retorna: - error: Error si la operación falla
Ejemplo:
defer client.Close()
// O manualmente
if err := client.Close(); err != nil {
fmt.Printf("Error al cerrar: %v\n", err)
}
Métodos de Eventos¶
On¶
Registra un handler para escuchar un evento específico en el namespace por defecto (/).
Parámetros: - event (string): Nombre del evento - handler (EventHandler): Función que se ejecuta cuando se recibe el evento
Ejemplo:
client.On("message", func(data ...interface{}) {
fmt.Printf("Mensaje: %v\n", data[0])
})
client.On("user-joined", func(data ...interface{}) {
username := data[0].(string)
fmt.Printf("%s se unió\n", username)
})
OnConnect¶
Registra un handler que se ejecuta cuando la conexión se establece exitosamente.
Parámetros: - handler (func()): Función que se ejecuta al conectar
Ejemplo:
OnDisconnect¶
Registra un handler que se ejecuta cuando la conexión se cierra.
Parámetros: - handler (func(reason string)): Función que recibe la razón de la desconexión
Ejemplo:
client.OnDisconnect(func(reason string) {
fmt.Printf("Desconectado: %s\n", reason)
if reason == "io server disconnect" {
fmt.Println("El servidor cerró la conexión")
}
})
OnError¶
Registra un handler que se ejecuta cuando ocurre un error.
Parámetros: - handler (func(err error)): Función que recibe el error
Ejemplo:
OnReconnectAttempt¶
Registra un handler que se ejecuta antes de cada intento de reconexión.
Parámetros: - handler (func(attempt int)): Función que recibe el número de intento
Ejemplo:
OnReconnect¶
Registra un handler que se ejecuta cuando la reconexión es exitosa.
Parámetros: - handler (func(attempt int)): Función que recibe el número de intentos que tomó reconectar
Ejemplo:
client.OnReconnect(func(attempt int) {
fmt.Printf("Reconectado después de %d intentos\n", attempt)
})
OnReconnectError¶
Registra un handler que se ejecuta cuando un intento de reconexión falla.
Parámetros: - handler (func(err error)): Función que recibe el error
Ejemplo:
OnReconnectFailed¶
Registra un handler que se ejecuta cuando todos los intentos de reconexión fallan.
Parámetros: - handler (func()): Función que se ejecuta cuando la reconexión falla definitivamente
Ejemplo:
client.OnReconnectFailed(func() {
fmt.Println("No se pudo reconectar")
notifyUser("Conexión perdida")
})
Métodos de Emisión¶
Emit¶
Emite un evento al servidor en el namespace por defecto (/).
Parámetros: - event (string): Nombre del evento - data (...interface{}): Argumentos a enviar (pueden ser múltiples)
Retorna: - error: Error si la operación falla
Ejemplo:
// Un argumento
client.Emit("message", "Hola mundo")
// Múltiples argumentos
client.Emit("user-action", "login", map[string]interface{}{
"username": "juan",
"timestamp": time.Now().Unix(),
})
// Manejar error
if err := client.Emit("important", data); err != nil {
fmt.Printf("Error al emitir: %v\n", err)
}
EmitWithAck¶
Emite un evento y espera una respuesta (acknowledgment) del servidor.
Parámetros: - event (string): Nombre del evento - ack (AckCallback): Función callback que recibe la respuesta - data (...interface{}): Argumentos a enviar
Retorna: - error: Error si la operación falla
Ejemplo:
client.EmitWithAck("get-user", func(response ...interface{}) {
if len(response) == 0 {
fmt.Println("No se recibió respuesta (timeout)")
return
}
user := response[0].(map[string]interface{})
fmt.Printf("Usuario: %v\n", user)
}, "user-123")
// Con timeout configurado
client := socketio.New("ws://localhost:3000", socketio.Options{
AckTimeout: 5 * time.Second,
})
client.EmitWithAck("slow-operation", func(response ...interface{}) {
if response == nil {
fmt.Println("Timeout: el servidor no respondió a tiempo")
return
}
fmt.Println("Respuesta:", response[0])
}, "datos")
Métodos de Estado¶
IsConnected¶
Retorna si el cliente está actualmente conectado al servidor.
Retorna: - bool: true si está conectado, false en caso contrario
Ejemplo:
GetState¶
Retorna el estado actual de la conexión.
Retorna: - ConnectionState: Estado actual de la conexión
Estados posibles: - StateDisconnected (0): Sin conexión - StateConnecting (1): Estableciendo conexión - StateConnected (2): Conectado - StateReconnecting (3): Intentando reconectar - StateDisconnecting (4): Cerrando conexión
Ejemplo:
state := client.GetState()
switch state {
case socketio.StateDisconnected:
fmt.Println("Desconectado")
case socketio.StateConnecting:
fmt.Println("Conectando...")
case socketio.StateConnected:
fmt.Println("Conectado")
case socketio.StateReconnecting:
fmt.Println("Reconectando...")
case socketio.StateDisconnecting:
fmt.Println("Desconectando...")
}
GetReconnectCount¶
Retorna el número de veces que el cliente ha intentado reconectar.
Retorna: - int: Contador de intentos de reconexión
Ejemplo:
count := client.GetReconnectCount()
fmt.Printf("Intentos de reconexión: %d\n", count)
// Usar en lógica de negocio
if count > 3 {
fmt.Println("Múltiples intentos de reconexión, verifica tu conexión")
}
Métodos de Configuración¶
Of¶
Retorna una instancia de Namespace para el path especificado. Si el namespace no existe, lo crea.
Parámetros: - path (string): Path del namespace (debe comenzar con /)
Retorna: - *Namespace: Instancia del namespace
Ejemplo:
// Namespace por defecto
client.On("global-event", handler)
// Namespace personalizado
chat := client.Of("/chat")
chat.On("message", func(data ...interface{}) {
fmt.Println("Mensaje de chat:", data[0])
})
chat.Emit("join", "sala-general")
// Múltiples namespaces
admin := client.Of("/admin")
admin.On("alert", adminHandler)
notifications := client.Of("/notifications")
notifications.On("new", notificationHandler)
Tipos Relacionados¶
EventHandler¶
Tipo de función para manejar eventos.
AckCallback¶
Tipo de función para manejar respuestas de acknowledgments.
ConnectionState¶
type ConnectionState int
const (
StateDisconnected ConnectionState = iota
StateConnecting
StateConnected
StateReconnecting
StateDisconnecting
)
Estados posibles de la conexión.
Uso Thread-Safe¶
Todos los métodos de Socket son thread-safe y pueden ser llamados desde múltiples goroutines simultáneamente.
// Emitir desde múltiples goroutines
for i := 0; i < 10; i++ {
go func(id int) {
client.Emit("worker", map[string]interface{}{
"id": id,
"data": processData(id),
})
}(i)
}
// Escuchar eventos es thread-safe
client.On("result", func(data ...interface{}) {
// Este handler puede ser llamado concurrentemente
go processResult(data)
})
Ejemplo Completo¶
package main
import (
"fmt"
"time"
socketio "github.com/arcaela/socket.io-client-go"
)
func main() {
// Crear cliente con opciones
client := socketio.New("ws://localhost:3000", socketio.Options{
Auth: map[string]interface{}{
"token": "secret-token",
},
ReconnectAttempts: 5,
ReconnectDelay: time.Second,
ReconnectDelayMax: 5 * time.Second,
Timeout: 30 * time.Second,
AckTimeout: 5 * time.Second,
})
defer client.Close()
// Eventos del ciclo de vida
client.OnConnect(func() {
fmt.Println("✅ Conectado")
// Emitir evento inicial
client.Emit("join", "sala-principal")
})
client.OnDisconnect(func(reason string) {
fmt.Printf("❌ Desconectado: %s\n", reason)
})
client.OnError(func(err error) {
fmt.Printf("⚠️ Error: %v\n", err)
})
// Eventos de reconexión
client.OnReconnectAttempt(func(attempt int) {
fmt.Printf("🔄 Intentando reconectar... (#%d)\n", attempt)
})
client.OnReconnect(func(attempt int) {
fmt.Printf("✅ Reconectado después de %d intentos\n", attempt)
})
// Eventos personalizados
client.On("message", func(data ...interface{}) {
fmt.Printf("📩 Mensaje: %v\n", data[0])
})
client.On("user-joined", func(data ...interface{}) {
username := data[0].(string)
fmt.Printf("👤 %s se unió\n", username)
})
// Emitir con acknowledgment
client.EmitWithAck("get-data", func(response ...interface{}) {
if response == nil {
fmt.Println("⏱️ Timeout esperando respuesta")
return
}
fmt.Printf("📦 Datos recibidos: %v\n", response[0])
}, "request-id-123")
// Namespaces
chat := client.Of("/chat")
chat.On("message", func(data ...interface{}) {
fmt.Printf("💬 Chat: %v\n", data[0])
})
// Verificar estado
if client.IsConnected() {
fmt.Println("Estado: Conectado")
}
// Mantener aplicación ejecutándose
select {}
}