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.
┌──────────────────────────┐
│ 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
└──────────────────────────┘
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.
| 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} |
Quan el servidor està en estat "running": true, envia missatges cada interval_ms mil·lisegons:
{ "type": "data", "value": 42 } ┌───────────────────────────────┐
│ 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 │
└───────────────────────────┘
[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}
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).
| 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. |
| 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. |
- Executa el projecte:
flutter run -d windows-
El servidor C++ s’inicia automàticament a través del binding integrat.
-
Utilitza la interfície per enviar ordres i veure dades en temps real.
┌───────────────┐ start ┌──────────────┐
│ Flutter UI │ ───────────────▶ │ Servidor C++ │
│ │ │ │
│ setInterval │ ◀─────────────── │ {"interval"} │
│ │ │ │
│ getStatus │ ───────────────▶ │ │
│ │ ◀─────────────── │ {"status"} │
│ │ ◀─────────────── │ {"data"} │
└───────────────┘ └──────────────┘
Aquest projecte és lliure d’ús i modificació amb finalitats educatives o experimentals. Autor: Rubio + GPT-5
