Saltar a contenido

Ejemplos

Colección de ejemplos completos y funcionales para aprender a usar Socket.IO Client en Go.

🚀 Inicio Rápido

Todos los ejemplos pueden ejecutarse con un solo comando:

cd examples/[nombre-ejemplo]
go run .

📚 Ejemplos Disponibles

1. Basic - Conexión Básica

Ubicación: examples/basic/

Ejemplo simple de conexión, emisión y recepción de eventos.

Características: - Conexión a servidor Socket.IO - Emitir eventos al servidor - Escuchar eventos del servidor - Manejo de conexión y desconexión

Uso:

cd examples/basic
go run .

Código clave:

client := socketio.New("ws://localhost:3000")

client.OnConnect(func() {
    client.Emit("hello", "world")
})

client.On("message", func(data ...interface{}) {
    fmt.Println("Recibido:", data[0])
})


2. Authentication - Autenticación JWT

Ubicación: examples/authentication/

Autenticación con JWT y headers personalizados.

Características: - Autenticación con token JWT - Headers HTTP personalizados - Manejo de errores de autenticación - Re-autenticación al reconectar

Uso:

cd examples/authentication
go run .

Código clave:

client := socketio.New("ws://localhost:3000", socketio.Options{
    Auth: map[string]interface{}{
        "token": "eyJhbGciOiJIUzI1NiIs...",
    },
    Headers: map[string]string{
        "Authorization": "Bearer token-123",
    },
})


3. Binary - Eventos Binarios

Ubicación: examples/binary/

Transferencia de archivos y datos binarios.

Características: - Subida de archivos (imágenes, PDFs, etc.) - Descarga de archivos - Streaming de datos binarios - Validación con checksums

Uso:

cd examples/binary
go run .

Código clave:

// Leer y enviar archivo
imageData, _ := os.ReadFile("photo.jpg")
client.Of("/").EmitBinary("upload", imageData, map[string]interface{}{
    "filename": "photo.jpg",
    "size": len(imageData),
})

// Recibir archivo
client.On("file", func(data ...interface{}) {
    binaryData := data[0].([]byte)
    os.WriteFile("downloaded.jpg", binaryData, 0644)
})


4. Chat - Aplicación de Chat

Ubicación: examples/chat/

Chat en tiempo real con salas y usuarios.

Características: - Mensajería en tiempo real - Salas (rooms) - Notificaciones de usuarios (join/leave) - Estado de escritura (typing)

Uso:

cd examples/chat
go run .

Código clave:

chat := client.Of("/chat")

chat.On("message", func(data ...interface{}) {
    user := data[0].(string)
    msg := data[1].(string)
    fmt.Printf("[%s]: %s\n", user, msg)
})

chat.Emit("join-room", "general")
chat.Emit("message", "juan", "Hola!")


5. Namespaces - Múltiples Namespaces

Ubicación: examples/namespaces/

Uso de múltiples namespaces para separación lógica.

Características: - Namespace por defecto (/) - Namespaces personalizados - Eventos aislados por namespace - Manejo independiente de conexión

Uso:

cd examples/namespaces
go run .

Código clave:

// Namespace por defecto
client.On("global-event", handler)

// Namespaces personalizados
chat := client.Of("/chat")
chat.On("message", chatHandler)

admin := client.Of("/admin")
admin.On("stats", adminHandler)


6. Acknowledgments - Request-Response

Ubicación: examples/acknowledgments/

Patrón request-response con acknowledgments.

Características: - Emisión con respuesta (ACK) - Timeout para respuestas - Manejo de respuestas del servidor - Patrón síncrono sobre conexión asíncrona

Uso:

cd examples/acknowledgments
go run .

Código clave:

client.EmitWithAck("get-user", func(response ...interface{}) {
    if response == nil {
        fmt.Println("Timeout")
        return
    }

    user := response[0].(map[string]interface{})
    fmt.Println("Usuario:", user["name"])
}, "user-123")


7. Reconnection - Reconexión Resiliente

Ubicación: examples/reconnection/

Manejo avanzado de reconexión automática.

Características: - Reconexión automática - Backoff exponencial - Re-sincronización de estado - Offline queue

Uso:

cd examples/reconnection
go run .

Código clave:

client := socketio.New("ws://localhost:3000", socketio.Options{
    ReconnectAttempts: 10,
    ReconnectDelay:    time.Second,
    ReconnectDelayMax: 5 * time.Second,
})

client.OnReconnectAttempt(func(attempt int) {
    fmt.Printf("Intento #%d\n", attempt)
})

client.OnReconnect(func(attempt int) {
    // Re-sincronizar estado
    client.Emit("sync-state", lastState)
})


8. Rooms - Salas y Broadcasting

Ubicación: examples/rooms/

Sistema de salas para mensajería grupal.

Características: - Unirse a salas - Salir de salas - Broadcasting a sala específica - Múltiples salas simultáneas

Uso:

cd examples/rooms
go run .

Código clave:

client.Emit("join-room", "sala-general")
client.Emit("join-room", "sala-tech")

client.On("room-message", func(data ...interface{}) {
    room := data[0].(string)
    msg := data[1].(string)
    fmt.Printf("[%s] %s\n", room, msg)
})

client.Emit("message-to-room", "sala-tech", "Hola tech!")


🎓 Por Nivel de Dificultad

Nivel Básico 🟢

Ideal para empezar:

  1. Basic - Conexión y eventos básicos
  2. Namespaces - Organización con namespaces
  3. Rooms - Salas para grupos

Nivel Intermedio 🟡

Patrones más avanzados:

  1. Authentication - Seguridad y autenticación
  2. Acknowledgments - Request-response pattern
  3. Reconnection - Resiliencia de red

Nivel Avanzado 🔴

Casos de uso complejos:

  1. Binary - Transferencia de archivos
  2. Chat - Aplicación completa end-to-end

🛠️ Requisitos

Servidor Socket.IO

La mayoría de ejemplos requieren un servidor Socket.IO. Puedes usar el testserver incluido o cualquier servidor Socket.IO v4.

Opción 1: Servidor de prueba (Node.js)

# Instalar Socket.IO
npm install socket.io

# Crear server.js
cat > server.js << 'EOF'
const { Server } = require('socket.io');
const io = new Server(3000);

io.on('connection', (socket) => {
  console.log('Cliente conectado');

  socket.on('hello', (data) => {
    console.log('Recibido:', data);
    socket.emit('message', 'Echo: ' + data);
  });
});

console.log('Servidor Socket.IO escuchando en puerto 3000');
EOF

# Ejecutar
node server.js

Opción 2: Servidor Python

pip install python-socketio
python testserver/server.py

📖 Estructura de Ejemplos

Cada ejemplo incluye:

  • README.md - Documentación específica del ejemplo
  • main.go - Código principal
  • Comentarios - Explicaciones detalladas en el código


💡 Tips

Ejecutar con Verbose

go run . -v

Ejecutar con Race Detector

go run -race .

Personalizar URL del Servidor

La mayoría de ejemplos permiten configurar la URL:

# Variable de entorno
SERVER_URL=ws://api.example.com go run .

# O editando el código
const serverURL = "ws://localhost:3000"

🤝 Contribuir

¿Tienes un ejemplo interesante? Abre un PR o sugiere una idea.


📄 Licencia

Todos los ejemplos están bajo la misma licencia MIT del proyecto.