Una implementación robusta de comunicación cliente-servidor utilizando sockets TCP puros y persistencia de datos.
NumbersGame es un proyecto diseñado para demostrar el manejo eficiente de conexiones de red de bajo nivel. El sistema permite la interacción entre múltiples clientes y un servidor centralizado, gestionando el flujo de datos (números) y almacenando los resultados de las sesiones en una base de datos ligera.
El objetivo principal es la práctica de protocolos TCP, el manejo de memoria dinámica en C y la integración con SQL.
- 🔌 Conexión TCP Persistente: Comunicación fiable y ordenada entre nodos.
- 💾 Persistencia de Datos: Integración con SQLite3 para guardar puntuaciones/registros.
- ⚡ Rendimiento Puro: Escrito 100% en C estándar (C99/C11) sin frameworks pesados.
- 🧵 Manejo de Concurrencia: Capacidad para atender peticiones (usando
fork()o hilos, según tu implementación).
| Tecnología | Descripción | Uso en el proyecto |
|---|---|---|
| C Standard | Lenguaje Principal | Lógica del servidor, cliente y gestión de memoria. |
| SQLite3 | Base de Datos | Almacenamiento de logs, usuarios o puntuaciones. |
| TCP/IP | Protocolo de Red | Transporte de paquetes de datos. |
| Make | Build System | Automatización de la compilación. |
Antes de ejecutar el proyecto, asegúrate de tener instalado el compilador y las librerías de SQLite.
sudo apt update
sudo apt install build-essential libsqlite3-devgit clone https://github.com/ByteKata08/NumbersGame.git
cd NumbersGamegcc Servidor.c Game.c -o server -lsqlite3
gcc Cliente.c -o clientmake./server
./client
El servidor te indicará qué paso sigue.
> USUARIO jason
< +Ok. Usuario correcto. Usa PASSWORD <password>
> PASSWORD 1234
< +Ok. Usuario validadoNota: Si no tienes cuenta, usa REGISTRO -u -p para crearla.
> INICIAR-PARTIDA
< +Ok. Esperando a que se conecte otro jugador.
... (cuando se conecta el segundo jugador) ...
< +Ok. Empieza la partida. NÚMERO OBJETIVO: 145
< +Ok. Es el turno de jason> TIRAR-DADOS 1 (o TIRAR-DADOS 2)
< +Ok. Tu puntuación actual es de 5 puntos.
< +Ok. Ahora es el turno de Pedro
< Ok. El oponente ha sacado: [<DADO 1>, <4>]
< +Ok. La puntuación actual de tu oponente es de 4 puntos.
< +Ok. Ahora es tu turno.> PLANTARME
< +Ok. Esperando a que finalice el otro jugador.
...
< +Ok. Tu puntuacion es 140, y la de tu oponente es 138 has ganado!| Comando | Parámetros | Descripción |
|---|---|---|
REGISTRO |
-u <usuario> -p <pass> |
Crea un usuario nuevo en la base de datos. |
USUARIO |
<nombre_usuario> |
Primer paso para iniciar sesión. |
PASSWORD |
<contraseña> |
Segundo paso para validar tu identidad. |
INICIAR-PARTIDA |
-ninguno- | Te pone en cola para buscar un oponente y empezar. |
TIRAR-DADOS |
1 |
Lanza un solo dado (suma 1-6 puntos). |
TIRAR-DADOS |
2 |
Lanza dos dados (suma 2-12 puntos). |
NO-TIRAR-DADOS |
-ninguno- | Pasas tu turno sin sumar puntos (Máximo 3 veces). |
PLANTARME |
-ninguno- | Te retiras con tus puntos actuales y esperas el final. |
SALIR |
-ninguno- | Cierra la conexión con el servidor de forma segura. |