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
- Wypchnij projekt do Gita i opublikuj go na jumphp.net (zobacz « Avec votre Claude » lub IDE: Mettre sur jumphp.net).
- Studio → projekt → Accès TCP → « Demander l'accès TCP » (z wiadomością dla administratora, jeśli chcesz).
- 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.