Tutorial: una connessione TCP, passo dopo passo
Il progetto di esempio apps/hello-tcp apre una connessione TCP verso un server Redis, gli invia PING e mostra la risposta (+PONG). Lo stesso codice
funziona su un computer (un socket) e nel browser (il bridge TCP di jumphp.net). Rifallo tu stesso in 8 passi.
1. Creare l'applicazione
bin/jumphp gui:new mon-tcp "Mon TCP" # apps/mon-tcp : une application graphique (formulaires, pas de HTML)
bin/jumphp install mon-tcp
2. Disegnare la finestra
Apri apps/mon-tcp/forms/MainForm.form.yaml (nell'IDE: l'editor visuale, scheda Design): due campi (host, port), un pulsante ping
(events: {click: onPingClick}), due etichette (status, result). Copia quello di apps/hello-tcp/forms/MainForm.form.yaml.
3. Scrivere il codice dietro
apps/mon-tcp/src/Form/MainForm.php: una classe final class MainForm extends JumPHP\Gui\Form. Una riga @property per widget (l'editor lo fa per te).
public function onPingClick(mixed $sender = null): void
{
$connection = $this->engine->tcp()->connect(trim($this->host->text), (int)$this->port->text); // ne bloque jamais
$connection->on('open', fn () => $connection->write("PING\r\n")); // connecté : on parle
$connection->on('data', function (string $bytes) use ($connection) { // la réponse
$this->result->text = 'Réponse : ' . trim($bytes);
$connection->close();
});
$connection->on('error', fn (string $message) => $this->result->text = $message); // le pourquoi d'un échec
}
Le regole da ricordare: mai chiamare stream_socket_client o fsockopen (non esistono nel browser); mai aspettare: le risposte arrivano
come eventi tra due immagini. Gli eventi: open, data (byte), close (il motivo, o null), error (un messaggio).
4. Un test che gioca la scena
apps/mon-tcp/tests/MainFormTest.php (vedi apps/hello-tcp/tests/MainFormTest.php): il test apre un vero server TCP locale (un finto Redis che risponde +PONG), clicca sul
pulsante, fa avanzare le immagini e verifica il testo visualizzato.
bin/jumphp test mon-tcp # php -l, phpstan, phpunit (le test ci-dessus), puis 600 images de la scène
bin/jumphp shot mon-tcp # une capture : ouvrez le PNG (apps/mon-tcp/var/screenshots/shot.png)
5. Provarla sul tuo computer
bin/jumphp run mon-tcp # une vraie fenêtre ; entrez l'adresse d'un Redis et cliquez « Send PING »
6. Provarla nel browser
bin/jumphp build mon-tcp && bin/jumphp serve mon-tcp # http://localhost:8080
Nel browser una pagina non può aprire socket: la connessione passa per il bridge TCP di jumphp.net. Lascia passare solo le applicazioni autorizzate
dall'amministratore, per una versione precisa del codice, verso qualsiasi porta (esclusa la posta in uscita 25 / 465 / 587) di indirizzi pubblici. Senza autorizzazione, l'evento
error dice perché (« This application has no TCP right… »). È il comportamento previsto: passa al punto 7.
7. Pubblicare e richiedere l'accesso TCP
- Fai il push del progetto su Git e pubblicalo su jumphp.net (vedi « Avec votre Claude » o l'IDE: Mettre sur jumphp.net).
- Studio → il progetto → Accès TCP → « Demander l'accès TCP » (con un messaggio per l'amministratore, se vuoi).
- L'amministratore vede la richiesta nella sua campanella e la autorizza (o la rifiuta): l'autorizzazione vale per il commit pubblicato. Un nuovo commit richiede una nuova autorizzazione.
8. Verificare
Apri la pagina del progetto su jumphp.net, inserisci l'indirizzo di un Redis pubblico (o il tuo, porta 6379) e clicca: The server answered: +PONG. L'amministratore vede la connessione
in tempo reale (Administration → Pont TCP: applicazione, destinazione, durata, byte) e può interromperla.
Per approfondire: docs/tcp.md (i diritti, le salvaguardie, il bridge su un server indipendente), docs/tuto-ssh.md (lo stesso attraverso un server SSH), UDP
($this->engine->udp()) e i ping ($this->engine->icmp()) nello stesso documento.