Tutorial: eine TCP-Verbindung, Schritt für Schritt
Das Beispielprojekt apps/hello-tcp öffnet eine TCP-Verbindung zu einem Redis-Server, sendet ihm PING und zeigt die Antwort (+PONG) an. Derselbe Code
funktioniert auf einem Computer (ein Socket) und im Browser (die TCP-Bridge von jumphp.net). Baue es selbst nach, in 8 Schritten.
1. Die Anwendung erstellen
bin/jumphp gui:new mon-tcp "Mon TCP" # apps/mon-tcp : une application graphique (formulaires, pas de HTML)
bin/jumphp install mon-tcp
2. Das Fenster zeichnen
Öffne apps/mon-tcp/forms/MainForm.form.yaml (in der IDE: der visuelle Editor, Tab Design): zwei Felder (host, port), eine Schaltfläche ping
(events: {click: onPingClick}), zwei Beschriftungen (status, result). Kopiere die aus apps/hello-tcp/forms/MainForm.form.yaml.
3. Den dahinterliegenden Code schreiben
apps/mon-tcp/src/Form/MainForm.php: eine Klasse final class MainForm extends JumPHP\Gui\Form. Eine @property-Zeile pro Widget (der Editor erledigt das für dich).
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
}
Die Regeln, die man sich merken sollte: niemals stream_socket_client oder fsockopen aufrufen (sie existieren im Browser nicht); niemals warten: Die Antworten kommen
als Ereignisse zwischen zwei Bildern. Die Ereignisse: open, data (Bytes), close (der Grund oder null), error (eine Meldung).
4. Ein Test, der die Szene spielt
apps/mon-tcp/tests/MainFormTest.php (siehe apps/hello-tcp/tests/MainFormTest.php): Der Test öffnet einen echten lokalen TCP-Server (ein falsches Redis, das +PONG antwortet), klickt auf die
Schaltfläche, lässt die Bilder weiterlaufen und prüft den angezeigten Text.
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. Auf deinem Computer ausprobieren
bin/jumphp run mon-tcp # une vraie fenêtre ; entrez l'adresse d'un Redis et cliquez « Send PING »
6. Im Browser ausprobieren
bin/jumphp build mon-tcp && bin/jumphp serve mon-tcp # http://localhost:8080
Im Browser kann eine Seite keinen Socket öffnen: Die Verbindung läuft über die TCP-Bridge von jumphp.net. Sie lässt nur Anwendungen durch, die vom
Administrator autorisiert sind, für eine bestimmte Version des Codes, zu jedem Port (außer ausgehender Mail 25 / 465 / 587) öffentlicher Adressen. Ohne Genehmigung sagt das Ereignis
error, warum (« This application has no TCP right… »). Das ist das erwartete Verhalten: Gehe zu Schritt 7.
7. Veröffentlichen und den TCP-Zugriff beantragen
- Pushe das Projekt zu Git und veröffentliche es auf jumphp.net (siehe « Avec votre Claude » oder die IDE: Mettre sur jumphp.net).
- Studio → das Projekt → Accès TCP → « Demander l'accès TCP » (auf Wunsch mit einer Nachricht an den Administrator).
- Der Administrator sieht die Anfrage in seiner Glocke und genehmigt (oder lehnt) sie ab: Die Genehmigung gilt für den veröffentlichten Commit. Ein neuer Commit erfordert eine neue Genehmigung.
8. Prüfen
Öffne die Projektseite auf jumphp.net, gib die Adresse eines öffentlichen Redis (oder deines eigenen, Port 6379) ein und klicke: The server answered: +PONG. Der Administrator sieht die Verbindung
live (Administration → Pont TCP: Anwendung, Ziel, Dauer, Bytes) und kann sie trennen.
Um weiterzugehen: docs/tcp.md (die Rechte, die Schutzmaßnahmen, die Bridge auf einem unabhängigen Server), docs/tuto-ssh.md (dasselbe über einen SSH-Server), UDP
($this->engine->udp()) und Pings ($this->engine->icmp()) im selben Dokument.