Entrar
PT

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

  1. Faz push do projeto para o Git e publica-o em jumphp.net (ver « Avec votre Claude » ou o IDE: Mettre sur jumphp.net).
  2. Studio → o projeto → Accès TCP → « Demander l'accès TCP » (com uma mensagem para o administrador, se quiseres).
  3. 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.