Accedi
IT

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

  1. Fai il push del progetto su Git e pubblicalo su jumphp.net (vedi « Avec votre Claude » o l'IDE: Mettre sur jumphp.net).
  2. Studio → il progetto → Accès TCP → « Demander l'accès TCP » (con un messaggio per l'amministratore, se vuoi).
  3. 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.