チュートリアル: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アクセスを申請する
- プロジェクトを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())とping($this->engine->icmp())は同じドキュメントにあります。