161
WEBSOCKET.md
Archivo normal
161
WEBSOCKET.md
Archivo normal
@@ -0,0 +1,161 @@
|
||||
# WebSocket Server - Configuración
|
||||
|
||||
## ✅ Problema Resuelto
|
||||
|
||||
El servidor WebSocket ahora funciona correctamente utilizando un servidor custom de Next.js.
|
||||
|
||||
## Arquitectura
|
||||
|
||||
Este proyecto utiliza un **servidor custom de Next.js** (`server.mjs`) que integra:
|
||||
- Next.js para el renderizado de páginas
|
||||
- Socket.IO para comunicación en tiempo real
|
||||
- HTTP server compartido entre ambos
|
||||
|
||||
### ¿Por qué un servidor custom?
|
||||
|
||||
Next.js 16 con App Router no soporta nativamente Socket.IO en rutas de API. La solución es crear un servidor HTTP personalizado que:
|
||||
|
||||
1. Maneja las peticiones HTTP de Next.js
|
||||
2. Maneja las conexiones WebSocket de Socket.IO
|
||||
3. Comparte el mismo puerto (3000)
|
||||
|
||||
## Configuración Actual
|
||||
|
||||
### Archivo: `server.mjs`
|
||||
|
||||
```javascript
|
||||
- Crea servidor HTTP
|
||||
- Inicializa Next.js app
|
||||
- Configura Socket.IO en el mismo servidor
|
||||
- Maneja eventos de juego en tiempo real
|
||||
```
|
||||
|
||||
### Cliente: `lib/store.ts`
|
||||
|
||||
```typescript
|
||||
const socket = io('http://localhost:3000', {
|
||||
transports: ['websocket', 'polling'],
|
||||
});
|
||||
```
|
||||
|
||||
**Nota:** Ya NO usa `path: '/api/socket'` porque Socket.IO está en la raíz del servidor.
|
||||
|
||||
## Eventos Socket.IO
|
||||
|
||||
### Cliente → Servidor
|
||||
- `create-room` - Crear nueva sala
|
||||
- `join-room` - Unirse a sala
|
||||
- `player-ready` - Jugador listo
|
||||
- `make-move` - Hacer jugada
|
||||
- `draw-tile` - Robar ficha
|
||||
- `disconnect` - Desconectar
|
||||
|
||||
### Servidor → Cliente
|
||||
- `room-created` - Sala creada (roomId)
|
||||
- `room-joined` - Unido a sala (gameState, playerId)
|
||||
- `game-started` - Juego iniciado
|
||||
- `game-state-updated` - Estado actualizado
|
||||
- `player-joined` - Nuevo jugador
|
||||
- `player-left` - Jugador salió
|
||||
- `invalid-move` - Jugada inválida
|
||||
- `error` - Error general
|
||||
|
||||
## Comandos
|
||||
|
||||
```bash
|
||||
# Desarrollo (con hot reload)
|
||||
npm run dev
|
||||
|
||||
# Producción
|
||||
npm run build
|
||||
npm start
|
||||
```
|
||||
|
||||
## Verificar Conexión
|
||||
|
||||
1. Abre la consola del navegador (F12)
|
||||
2. Busca mensajes como:
|
||||
- "Connected to socket server"
|
||||
- "Client connected: [socket-id]"
|
||||
|
||||
3. En la terminal del servidor verás:
|
||||
- "> Ready on http://localhost:3000"
|
||||
- "> Socket.IO server running"
|
||||
- "Client connected: [socket-id]"
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### El cliente no conecta
|
||||
|
||||
**Síntomas:** No ves "Connected to socket server" en la consola
|
||||
|
||||
**Solución:**
|
||||
1. Verifica que el servidor esté corriendo: `npm run dev`
|
||||
2. Revisa la consola del servidor para errores
|
||||
3. Asegúrate que el puerto 3000 no esté ocupado
|
||||
4. Limpia caché del navegador y recarga
|
||||
|
||||
### Error: "ERR_CONNECTION_REFUSED"
|
||||
|
||||
**Causa:** El servidor no está corriendo o puerto bloqueado
|
||||
|
||||
**Solución:**
|
||||
```bash
|
||||
# Matar proceso en puerto 3000
|
||||
lsof -ti:3000 | xargs kill -9
|
||||
|
||||
# Reiniciar servidor
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Socket.IO no envía eventos
|
||||
|
||||
**Causa:** El evento no está registrado correctamente
|
||||
|
||||
**Solución:**
|
||||
1. Verifica que el evento exista en `server.mjs`
|
||||
2. Revisa que el nombre del evento coincida exactamente
|
||||
3. Checa la consola del servidor para errores
|
||||
|
||||
## Estado Actual
|
||||
|
||||
✅ **Funcionando correctamente**
|
||||
|
||||
El servidor WebSocket está:
|
||||
- ✅ Corriendo en http://localhost:3000
|
||||
- ✅ Aceptando conexiones Socket.IO
|
||||
- ✅ Manejando eventos de juego
|
||||
- ✅ Sincronizando estado entre jugadores
|
||||
- ✅ Soportando múltiples salas
|
||||
|
||||
## Logs del Servidor
|
||||
|
||||
Cuando todo funciona correctamente verás:
|
||||
|
||||
```
|
||||
> domino@0.1.0 dev
|
||||
> node server.mjs
|
||||
|
||||
> Ready on http://localhost:3000
|
||||
> Socket.IO server running
|
||||
Client connected: abc123xyz
|
||||
Room created: XYZ789
|
||||
Player Player1 joined room XYZ789
|
||||
Game started in room: XYZ789
|
||||
```
|
||||
|
||||
## Próximos Pasos
|
||||
|
||||
Para producción, considera:
|
||||
|
||||
1. **Variables de entorno** para la URL del servidor
|
||||
2. **SSL/TLS** para conexiones seguras (wss://)
|
||||
3. **Autenticación** de jugadores
|
||||
4. **Rate limiting** para prevenir spam
|
||||
5. **Monitoreo** de conexiones activas
|
||||
6. **Backup** de salas activas
|
||||
7. **Scaling** con Redis para múltiples instancias
|
||||
|
||||
---
|
||||
|
||||
**El servidor WebSocket está completamente funcional** 🎉
|
||||
Referencia en una nueva incidencia
Block a user