TR

Eğitim: bir TCP bağlantısı, adım adım

apps/hello-tcp örnek projesi bir Redis sunucusuna TCP bağlantısı açar, ona PING gönderir ve yanıtı (+PONG) gösterir. Aynı kod bir bilgisayarda (bir soket) ve tarayıcıda (jumphp.net'in TCP köprüsü) çalışır. Bunu 8 adımda kendiniz yeniden yapın.

1. Uygulamayı oluşturmak

bin/jumphp gui:new mon-tcp "Mon TCP"        # apps/mon-tcp : une application graphique (formulaires, pas de HTML)
bin/jumphp install mon-tcp

2. Pencereyi çizmek

apps/mon-tcp/forms/MainForm.form.yaml dosyasını açın (IDE'de: görsel düzenleyici, Design sekmesi): iki alan (host, port), bir ping düğmesi (events: {click: onPingClick}), iki etiket (status, result). apps/hello-tcp/forms/MainForm.form.yaml dosyasındakini kopyalayın.

3. Arkasındaki kodu yazmak

apps/mon-tcp/src/Form/MainForm.php: bir final class MainForm extends JumPHP\Gui\Form sınıfı. Her widget için bir @property satırı (düzenleyici bunu sizin için yapar).

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
}

Akılda tutulacak kurallar: stream_socket_client veya fsockopen asla çağırmayın (tarayıcıda yoktur); asla beklemeyin: yanıtlar iki kare arasında olay olarak gelir. Olaylar: open, data (baytlar), close (neden veya null), error (bir ileti).

4. Sahneyi oynayan bir test

apps/mon-tcp/tests/MainFormTest.php (bkz. apps/hello-tcp/tests/MainFormTest.php): test gerçek bir yerel TCP sunucusu açar (+PONG yanıtlayan sahte bir Redis), düğmeye tıklar, kareleri ilerletir ve görüntülenen metni doğrular.

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. Bilgisayarınızda denemek

bin/jumphp run mon-tcp           # une vraie fenêtre ; entrez l'adresse d'un Redis et cliquez « Send PING »

6. Tarayıcıda denemek

bin/jumphp build mon-tcp && bin/jumphp serve mon-tcp      # http://localhost:8080

Tarayıcıda bir sayfa soket açamaz: bağlantı jumphp.net'in TCP köprüsünden geçer. Köprü yalnızca yönetici tarafından onaylanmış uygulamalara, kodun belirli bir sürümü için, herkese açık adreslerin herhangi bir portuna (giden posta 25 / 465 / 587 hariç) izin verir. İzin yoksa error olayı nedenini söyler (« This application has no TCP right… »). Bu beklenen davranıştır: 7. adıma geçin.

7. Yayımlamak ve TCP erişimi istemek

  1. Projeyi Git'e gönderin ve jumphp.net'te yayımlayın (bkz. « Avec votre Claude » veya IDE: Mettre sur jumphp.net).
  2. Studio → proje → Accès TCP → « Demander l'accès TCP » (isterseniz yöneticiye bir mesajla).
  3. Yönetici isteği çanında görür ve onaylar (veya reddeder): izin yayımlanan commit için geçerlidir. Yeni bir commit yeni bir izin gerektirir.

8. Doğrulamak

jumphp.net'teki proje sayfasını açın, herkese açık bir Redis'in (veya kendinizinkinin, port 6379) adresini girin ve tıklayın: The server answered: +PONG. Yönetici bağlantıyı canlı görür (Administration → Pont TCP: uygulama, hedef, süre, bayt) ve kesebilir.

Daha ileri gitmek için: docs/tcp.md (haklar, güvenceler, bağımsız bir sunucuda köprü), docs/tuto-ssh.md (aynısı bir SSH sunucusu üzerinden), UDP ($this->engine->udp()) ve ping'ler ($this->engine->icmp()) aynı belgede.