튜토리얼: 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 탭): 필드 두 개(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 서버(+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(또는 직접 운영하는 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())은 같은 문서에 있습니다.