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
- Sube el proyecto a Git y publícalo en jumphp.net (véase « Avec votre Claude » o el IDE: Mettre sur jumphp.net).
- Studio → el proyecto → Accès TCP → « Demander l'accès TCP » (con un mensaje para el administrador si quieres).
- 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.