Tutorial: uma ligação TCP, passo a passo
O projeto de exemplo apps/hello-tcp abre uma ligação TCP para um servidor Redis, envia-lhe PING e mostra a resposta (+PONG). O mesmo código
funciona num computador (um socket) e no navegador (a ponte TCP de jumphp.net). Refaz-o tu mesmo em 8 passos.
1. Criar a aplicação
bin/jumphp gui:new mon-tcp "Mon TCP" # apps/mon-tcp : une application graphique (formulaires, pas de HTML)
bin/jumphp install mon-tcp
2. Desenhar a janela
Abre apps/mon-tcp/forms/MainForm.form.yaml (no IDE: o editor visual, separador Design): dois campos (host, port), um botão ping
(events: {click: onPingClick}), duas etiquetas (status, result). Copia o de apps/hello-tcp/forms/MainForm.form.yaml.
3. Escrever o código por trás
apps/mon-tcp/src/Form/MainForm.php: uma classe final class MainForm extends JumPHP\Gui\Form. Uma linha @property por widget (o editor fá-lo por ti).
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
}
As regras a reter: nunca chamar stream_socket_client nem fsockopen (não existem no navegador); nunca esperar: as respostas chegam
como eventos entre duas imagens. Os eventos: open, data (bytes), close (o motivo, ou null), error (uma mensagem).
4. Um teste que joga a cena
apps/mon-tcp/tests/MainFormTest.php (ver apps/hello-tcp/tests/MainFormTest.php): o teste abre um verdadeiro servidor TCP local (um falso Redis que responde +PONG), clica no
botão, avança as imagens e verifica o texto apresentado.
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. Experimentá-la no teu computador
bin/jumphp run mon-tcp # une vraie fenêtre ; entrez l'adresse d'un Redis et cliquez « Send PING »
6. Experimentá-la no navegador
bin/jumphp build mon-tcp && bin/jumphp serve mon-tcp # http://localhost:8080
No navegador, uma página não pode abrir sockets: a ligação passa pela ponte TCP de jumphp.net. Esta só deixa passar as aplicações autorizadas pelo
administrador, para uma versão precisa do código, para qualquer porta (exceto correio de saída 25 / 465 / 587) de endereços públicos. Sem autorização, o evento
error diz porquê (« This application has no TCP right… »). É o comportamento esperado: passa ao passo 7.
7. Publicar e pedir o acesso TCP
- Faz push do projeto para o Git e publica-o em jumphp.net (ver « Avec votre Claude » ou o IDE: Mettre sur jumphp.net).
- Studio → o projeto → Accès TCP → « Demander l'accès TCP » (com uma mensagem para o administrador, se quiseres).
- O administrador vê o pedido no seu sino e autoriza-o (ou recusa-o): a autorização vale para o commit publicado. Um novo commit exige uma nova autorização.
8. Verificar
Abre a página do projeto em jumphp.net, introduz o endereço de um Redis público (ou o teu, porta 6379) e clica: The server answered: +PONG. O administrador vê a ligação
em direto (Administration → Pont TCP: aplicação, destino, duração, bytes) e pode cortá-la.
Para ir mais longe: docs/tcp.md (os direitos, as salvaguardas, a ponte num servidor independente), docs/tuto-ssh.md (o mesmo através de um servidor SSH), UDP
($this->engine->udp()) e os pings ($this->engine->icmp()) no mesmo documento.