UK

Посібник: 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

  1. Надішліть проєкт у Git і опублікуйте його на jumphp.net (див. « Avec votre Claude » або IDE: Mettre sur jumphp.net).
  2. Studio → проєкт → Accès TCP → « Demander l'accès TCP » (за бажання з повідомленням для адміністратора).
  3. Адміністратор бачить запит у своєму дзвонику та дозволяє його (або відхиляє): дозвіл діє для опублікованого коміту. Новий коміт потребує нового дозволу.

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()) у тому самому документі.