Skip to content

rubiolbernat/flutter_cpp_server

Repository files navigation

🧩 Projecte Flutter + C++ Socket Server

Aquest projecte mostra com un client Flutter (Dart) pot comunicar-se en temps real amb un servidor C++ mitjançant sockets TCP locals.
L'objectiu és enviar i rebre dades JSON entre tots dos costats per simular una transmissió periòdica controlable des de la interfície gràfica.

Final version: Look


⚙️ Funcionament general

1️⃣ Estructura del sistema

┌──────────────────────────┐
│        Flutter UI        │
│  ──────────────────────  │
│  • Connexió TCP (127.0.0.1:5555)
│  • Envia ordres JSON
│  • Rep missatges en temps real
│  • Mostra estat i valors al GUI
└────────────┬─────────────┘
             │ JSON
             ▼
┌──────────────────────────┐
│     Servidor C++ (Win)   │
│  ──────────────────────  │
│  • Rep ordres: start / stop / get_status / set_interval
│  • Envia dades periòdiques {"type":"data","value":N}
│  • Gestiona múltiples clients (un per cop)
│  • S’executa en un fil separat
└──────────────────────────┘

🧠 Com funciona el servidor (cpp_server.cpp)

🔹 Protocol de comunicació

El servidor utilitza sockets TCP sobre localhost (127.0.0.1:5555). Els missatges són cadenes JSON separades per un salt de línia (\n) per marcar el final de cada missatge.

🔹 Ordres disponibles

Comanda JSON Descripció Resposta JSON
{"cmd":"start"} Inicia l’enviament periòdic de dades. {"type":"status","running":true}
{"cmd":"stop"} Atura l’enviament periòdic. {"type":"status","running":false}
{"cmd":"get_status"} Consulta l’estat actual i l’interval. {"type":"status","running":true/false,"counter":N,"interval_ms":X}
{"cmd":"set_interval","interval_ms":VAL} Canvia l’interval d’enviament en mil·lisegons (mínim 20 ms). {"type":"status","msg":"interval_updated","interval_ms":VAL}

🔄 Enviament de dades

Quan el servidor està en estat "running": true, envia missatges cada interval_ms mil·lisegons:

{ "type": "data", "value": 42 }

🧩 Esquema intern del servidor

                 ┌───────────────────────────────┐
                 │         Fil principal         │
                 │-------------------------------│
                 │  - Inicialitza WinSock        │
                 │  - Escolta al port 5555       │
                 │  - Accepta connexions         │
                 └───────────────┬───────────────┘
                                 │
                                 ▼
                  ┌─────────────────────────────┐
                  │        Fil per client       │
                  │-----------------------------│
                  │  - Rep ordres JSON          │
                  │  - Gestiona lògica          │
                  │  - Crea fil d’enviament     │
                  └───────────────┬─────────────┘
                                  │
                                  ▼
                    ┌───────────────────────────┐
                    │    Fil d’enviament (loop) │
                    │---------------------------│
                    │ if sending:               │
                    │   envia {"data",value:N}  │
                    │ espera interval_ms ms     │
                    └───────────────────────────┘

💡 Exemple de flux de missatges

[Flutter] -> {"cmd":"start"}
[C++]     -> {"type":"status","running":true}

[C++]     -> {"type":"data","value":0}
[C++]     -> {"type":"data","value":1}
[C++]     -> {"type":"data","value":2}

[Flutter] -> {"cmd":"set_interval","interval_ms":200}
[C++]     -> {"type":"status","msg":"interval_updated","interval_ms":200}

[Flutter] -> {"cmd":"get_status"}
[C++]     -> {"type":"status","running":true,"counter":42,"interval_ms":200}

[Flutter] -> {"cmd":"stop"}
[C++]     -> {"type":"status","running":false}

🖥️ Flutter (client)

El client Flutter es connecta automàticament al servidor mitjançant Socket.connect("127.0.0.1", 5555).

A la interfície:

  • Pots iniciar/aturar l’enviament amb botons.

  • Pots consultar l’estat actual.

  • Pots modificar l’interval d’enviament.

  • Es mostren les dades rebudes (value) i l’estat (running, interval_ms).

🧱 Arquitectura del Codi

🧩 Fitxers principals

Fitxer Descripció
lib/main.dart Client Flutter, UI i lògica de connexió TCP.
windows/cpp_server.cpp Implementació del servidor TCP en C++.
windows/runner/main.cpp Punt d’entrada de Flutter a Windows.

🧮 Variables globals del servidor

Variable Tipus Funció
running std::atomic<bool> Controla si el servidor està actiu.
sending std::atomic<bool> Controla si s’estan enviant dades.
counter std::atomic<int> Comptador de missatges enviats.
sendIntervalMs std::atomic<int> Interval entre missatges en mil·lisegons.

🧰 Com executar

🔧 Des de Flutter

  1. Executa el projecte:
flutter run -d windows
  1. El servidor C++ s’inicia automàticament a través del binding integrat.

  2. Utilitza la interfície per enviar ordres i veure dades en temps real.


🧩 Exemple visual del flux complet

┌───────────────┐      start       ┌──────────────┐
│   Flutter UI  │ ───────────────▶ │ Servidor C++ │
│               │                  │              │
│   setInterval │ ◀─────────────── │ {"interval"} │
│               │                  │              │
│   getStatus   │ ───────────────▶ │              │
│               │ ◀─────────────── │ {"status"}   │
│               │ ◀─────────────── │ {"data"}     │
└───────────────┘                  └──────────────┘

📜 Llicència

Aquest projecte és lliure d’ús i modificació amb finalitats educatives o experimentals. Autor: Rubio + GPT-5

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published