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
- Projeyi Git'e gönderin ve jumphp.net'te yayımlayın (bkz. « Avec votre Claude » veya IDE: Mettre sur jumphp.net).
- Studio → proje → Accès TCP → « Demander l'accès TCP » (isterseniz yöneticiye bir mesajla).
- 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.