Посібник: TCP-з'єднання, крок за кроком
Приклад проєкту apps/hello-tcp відкриває TCP-з'єднання із сервером Redis, надсилає йому PING і показує відповідь (+PONG). Той самий код
працює на комп'ютері (сокет) і в браузері (TCP-міст jumphp.net). Повторіть це самі за 8 кроків.
1. Створити застосунок
bin/jumphp gui:new mon-tcp "Mon TCP" # apps/mon-tcp : une application graphique (formulaires, pas de HTML)
bin/jumphp install mon-tcp
2. Намалювати вікно
Відкрийте apps/mon-tcp/forms/MainForm.form.yaml (в IDE: візуальний редактор, вкладка Design): два поля (host, port), кнопка ping
(events: {click: onPingClick}), два написи (status, result). Скопіюйте файл з apps/hello-tcp/forms/MainForm.form.yaml.
3. Написати код за вікном
apps/mon-tcp/src/Form/MainForm.php: клас final class MainForm extends JumPHP\Gui\Form. Один рядок @property на віджет (редактор робить це за вас).
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
}
Правила, які варто запам'ятати: ніколи не викликайте stream_socket_client чи fsockopen (їх немає в браузері); ніколи не чекайте: відповіді надходять
як події між двома кадрами. Події: open, data (байти), close (причина або null), error (повідомлення).
4. Тест, що програє сцену
apps/mon-tcp/tests/MainFormTest.php (див. apps/hello-tcp/tests/MainFormTest.php): тест відкриває справжній локальний TCP-сервер (підроблений Redis, що відповідає +PONG), натискає
кнопку, прокручує кадри й перевіряє показаний текст.
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. Спробувати на своєму комп'ютері
bin/jumphp run mon-tcp # une vraie fenêtre ; entrez l'adresse d'un Redis et cliquez « Send PING »
6. Спробувати в браузері
bin/jumphp build mon-tcp && bin/jumphp serve mon-tcp # http://localhost:8080
У браузері сторінка не може відкрити сокет: з'єднання проходить через TCP-міст jumphp.net. Він пропускає лише застосунки, дозволені
адміністратором, для конкретної версії коду, на будь-який порт (окрім вихідної пошти 25 / 465 / 587) публічних адрес. Без дозволу подія
error пояснює чому (« This application has no TCP right… »). Це очікувана поведінка: переходьте до кроку 7.
7. Опублікувати й запросити доступ TCP
- Надішліть проєкт у Git і опублікуйте його на jumphp.net (див. « Avec votre Claude » або IDE: Mettre sur jumphp.net).
- Studio → проєкт → Accès TCP → « Demander l'accès TCP » (за бажання з повідомленням для адміністратора).
- Адміністратор бачить запит у своєму дзвонику та дозволяє його (або відхиляє): дозвіл діє для опублікованого коміту. Новий коміт потребує нового дозволу.
8. Перевірити
Відкрийте сторінку проєкту на jumphp.net, введіть адресу публічного Redis (або власного, порт 6379) і натисніть: The server answered: +PONG. Адміністратор бачить з'єднання
наживо (Administration → Pont TCP: застосунок, ціль, тривалість, байти) і може його відключити.
Щоб піти далі: docs/tcp.md (права, запобіжники, міст на незалежному сервері), docs/tuto-ssh.md (те саме через SSH-сервер), UDP
($this->engine->udp()) і пінги ($this->engine->icmp()) у тому самому документі.