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:
📚 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:
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:
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:
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:
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:
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:
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:
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:
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:
- Basic - Conexión y eventos básicos
- Namespaces - Organización con namespaces
- Rooms - Salas para grupos
Nivel Intermedio 🟡¶
Patrones más avanzados:
- Authentication - Seguridad y autenticación
- Acknowledgments - Request-response pattern
- Reconnection - Resiliencia de red
Nivel Avanzado 🔴¶
Casos de uso complejos:
- Binary - Transferencia de archivos
- 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
📖 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
🔗 Links Útiles¶
💡 Tips¶
Ejecutar con Verbose¶
Ejecutar con Race Detector¶
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.