ES

Tutorial: una conexión TCP, paso a paso

El proyecto de ejemplo apps/hello-tcp abre una conexión TCP hacia un servidor Redis, le envía PING y muestra la respuesta (+PONG). El mismo código funciona en un ordenador (un socket) y en el navegador (el puente TCP de jumphp.net). Rehazlo tú mismo en 8 pasos.

1. Crear la aplicación

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

2. Dibujar la ventana

Abre apps/mon-tcp/forms/MainForm.form.yaml (en el IDE: el editor visual, pestaña Design): dos campos (host, port), un botón ping (events: {click: onPingClick}), dos etiquetas (status, result). Copia el de apps/hello-tcp/forms/MainForm.form.yaml.

3. Escribir el código detrás

apps/mon-tcp/src/Form/MainForm.php: una clase final class MainForm extends JumPHP\Gui\Form. Una línea @property por widget (el editor lo hace 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
}

Las reglas que hay que recordar: nunca llamar a stream_socket_client ni a fsockopen (no existen en el navegador); nunca esperar: las respuestas llegan como eventos entre dos imágenes. Los eventos: open, data (bytes), close (el motivo, o null), error (un mensaje).

4. Una prueba que juega la escena

apps/mon-tcp/tests/MainFormTest.php (véase apps/hello-tcp/tests/MainFormTest.php): la prueba abre un verdadero servidor TCP local (un falso Redis que responde +PONG), hace clic en el botón, avanza las imágenes y comprueba el texto mostrado.

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. Probarla en tu ordenador

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

6. Probarla en el navegador

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

En el navegador, una página no puede abrir sockets: la conexión pasa por el puente TCP de jumphp.net. Solo deja pasar las aplicaciones autorizadas por el administrador, para una versión concreta del código, hacia cualquier puerto (salvo correo saliente 25 / 465 / 587) de direcciones públicas. Sin autorización, el evento error dice por qué (« This application has no TCP right… »). Es el comportamiento esperado: pasa al paso 7.

7. Publicar y solicitar el acceso TCP

  1. Sube el proyecto a Git y publícalo en jumphp.net (véase « Avec votre Claude » o el IDE: Mettre sur jumphp.net).
  2. Studio → el proyecto → Accès TCP → « Demander l'accès TCP » (con un mensaje para el administrador si quieres).
  3. El administrador ve la solicitud en su campana y la autoriza (o la rechaza): la autorización vale para el commit publicado. Un nuevo commit requiere una nueva autorización.

8. Verificar

Abre la página del proyecto en jumphp.net, introduce la dirección de un Redis público (o el tuyo, puerto 6379) y haz clic: The server answered: +PONG. El administrador ve la conexión en directo (Administration → Pont TCP: aplicación, destino, duración, bytes) y puede cortarla.

Para ir más lejos: docs/tcp.md (los derechos, las salvaguardas, el puente en un servidor independiente), docs/tuto-ssh.md (lo mismo a través de un servidor SSH), UDP ($this->engine->udp()) y los pings ($this->engine->icmp()) en el mismo documento.