PL

Samouczek: połączenie TCP, krok po kroku

Przykładowy projekt apps/hello-tcp otwiera połączenie TCP z serwerem Redis, wysyła mu PING i wyświetla odpowiedź (+PONG). Ten sam kod działa na komputerze (gniazdo) i w przeglądarce (most TCP jumphp.net). Odtwórz go samodzielnie w 8 krokach.

1. Utworzyć aplikację

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

2. Narysować okno

Otwórz apps/mon-tcp/forms/MainForm.form.yaml (w IDE: edytor wizualny, zakładka Design): dwa pola (host, port), przycisk ping (events: {click: onPingClick}), dwie etykiety (status, result). Skopiuj ten z apps/hello-tcp/forms/MainForm.form.yaml.

3. Napisać kod stojący za oknem

apps/mon-tcp/src/Form/MainForm.php: klasa final class MainForm extends JumPHP\Gui\Form. Jedna linia @property na widżet (edytor robi to za Ciebie).

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
}

Zasady do zapamiętania: nigdy nie wywołuj stream_socket_client ani fsockopen (nie istnieją w przeglądarce); nigdy nie czekaj: odpowiedzi przychodzą jako zdarzenia między dwiema klatkami. Zdarzenia: open, data (bajty), close (powód lub null), error (komunikat).

4. Test, który gra scenę

apps/mon-tcp/tests/MainFormTest.php (zobacz apps/hello-tcp/tests/MainFormTest.php): test otwiera prawdziwy lokalny serwer TCP (fałszywy Redis odpowiadający +PONG), klika przycisk, przesuwa klatki i sprawdza wyświetlony 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. Wypróbować na swoim komputerze

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

6. Wypróbować w przeglądarce

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

W przeglądarce strona nie może otworzyć gniazda: połączenie przechodzi przez most TCP jumphp.net. Przepuszcza on tylko aplikacje zatwierdzone przez administratora, dla konkretnej wersji kodu, do dowolnego portu (poza pocztą wychodzącą 25 / 465 / 587) adresów publicznych. Bez zgody zdarzenie error mówi dlaczego (« This application has no TCP right… »). To oczekiwane zachowanie: przejdź do kroku 7.

7. Opublikować i poprosić o dostęp TCP

  1. Wypchnij projekt do Gita i opublikuj go na jumphp.net (zobacz « Avec votre Claude » lub IDE: Mettre sur jumphp.net).
  2. Studio → projekt → Accès TCP → « Demander l'accès TCP » (z wiadomością dla administratora, jeśli chcesz).
  3. Administrator widzi prośbę w swoim dzwonku i ją zatwierdza (lub odrzuca): zgoda obowiązuje dla opublikowanego commita. Nowy commit wymaga nowej zgody.

8. Sprawdzić

Otwórz stronę projektu na jumphp.net, wpisz adres publicznego Redisa (lub własnego, port 6379) i kliknij: The server answered: +PONG. Administrator widzi połączenie na żywo (Administration → Pont TCP: aplikacja, cel, czas trwania, bajty) i może je odciąć.

Aby pójść dalej: docs/tcp.md (prawa, zabezpieczenia, most na niezależnym serwerze), docs/tuto-ssh.md (to samo przez serwer SSH), UDP ($this->engine->udp()) i pingi ($this->engine->icmp()) w tym samym dokumencie.