JA

チュートリアル:TCP接続をステップごとに

サンプルプロジェクトapps/hello-tcpは、RedisサーバーへTCP接続を開き、PINGを送って応答(+PONG)を表示します。同じコードが コンピューター(ソケット)でもブラウザ(jumphp.netのTCPブリッジ)でも動作します。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タブ):2つのフィールド(host、port)、pingボタン (events: {click: onPingClick})、2つのラベル(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の行が1行必要です(エディターが自動で書いてくれます)。

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サーバー(+PONGを返す偽のRedis)を開き、 ボタンをクリックし、フレームを進めて、表示されたテキストを検証します。

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

ブラウザではページがソケットを開けないため、接続はjumphp.netのTCPブリッジを通ります。ブリッジが通すのは、管理者が許可した アプリケーションだけで、コードの特定のバージョンに対し、公開アドレスの任意のポート(送信メールの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())とping($this->engine->icmp())は同じドキュメントにあります。