로그인
KO

튜토리얼: 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 접근 요청하기

  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(또는 직접 운영하는 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())은 같은 문서에 있습니다.