Inloggen
NL

Tutorial: een TCP-verbinding, stap voor stap

Het voorbeeldproject apps/hello-tcp opent een TCP-verbinding naar een Redis-server, stuurt er PING naar en toont het antwoord (+PONG). Dezelfde code werkt op een computer (een socket) en in de browser (de TCP-brug van jumphp.net). Maak het zelf na in 8 stappen.

1. De toepassing maken

bin/jumphp gui:new mon-tcp "Mon TCP"        # apps/mon-tcp : une application graphique (formulaires, pas de HTML)
bin/jumphp install mon-tcp

2. Het venster tekenen

Open apps/mon-tcp/forms/MainForm.form.yaml (in de IDE: de visuele editor, tabblad Design): twee velden (host, port), een knop ping (events: {click: onPingClick}), twee labels (status, result). Kopieer die van apps/hello-tcp/forms/MainForm.form.yaml.

3. De code erachter schrijven

apps/mon-tcp/src/Form/MainForm.php: een klasse final class MainForm extends JumPHP\Gui\Form. Eén @property-regel per widget (de editor doet dat voor je).

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
}

De regels om te onthouden: roep nooit stream_socket_client of fsockopen aan (ze bestaan niet in de browser); wacht nooit: de antwoorden komen als gebeurtenissen tussen twee beelden. De gebeurtenissen: open, data (bytes), close (de reden, of null), error (een bericht).

4. Een test die de scène speelt

apps/mon-tcp/tests/MainFormTest.php (zie apps/hello-tcp/tests/MainFormTest.php): de test opent een echte lokale TCP-server (een nep-Redis die +PONG antwoordt), klikt op de knop, laat de beelden doorlopen en controleert de getoonde tekst.

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. Uitproberen op je computer

bin/jumphp run mon-tcp           # une vraie fenêtre ; entrez l'adresse d'un Redis et cliquez « Send PING »

6. Uitproberen in de browser

bin/jumphp build mon-tcp && bin/jumphp serve mon-tcp      # http://localhost:8080

In de browser kan een pagina geen socket openen: de verbinding loopt via de TCP-brug van jumphp.net. Die laat alleen toepassingen door die door de beheerder zijn goedgekeurd, voor een precieze versie van de code, naar elke poort (behalve uitgaande e-mail 25 / 465 / 587) van openbare adressen. Zonder goedkeuring zegt de gebeurtenis error waarom (« This application has no TCP right… »). Dat is het verwachte gedrag: ga naar stap 7.

7. Publiceren en TCP-toegang aanvragen

  1. Push het project naar Git en publiceer het op jumphp.net (zie « Avec votre Claude » of de IDE: Mettre sur jumphp.net).
  2. Studio → het project → Accès TCP → « Demander l'accès TCP » (met desgewenst een bericht voor de beheerder).
  3. De beheerder ziet de aanvraag in zijn bel en keurt hem goed (of wijst hem af): de goedkeuring geldt voor de gepubliceerde commit. Een nieuwe commit vraagt een nieuwe goedkeuring.

8. Controleren

Open de projectpagina op jumphp.net, voer het adres van een openbare Redis in (of je eigen, poort 6379) en klik: The server answered: +PONG. De beheerder ziet de verbinding live (Administration → Pont TCP: toepassing, doel, duur, bytes) en kan hem afsluiten.

Om verder te gaan: docs/tcp.md (de rechten, de beveiligingen, de brug op een onafhankelijke server), docs/tuto-ssh.md (hetzelfde via een SSH-server), UDP ($this->engine->udp()) en pings ($this->engine->icmp()) in hetzelfde document.