CodeBlanks Logo Icon CodeBlanks

Broadcast

Vec<TcpStream> ile tüm istemcilere yazarsın.

Broadcast

Bir mesaj geldiğinde gönderen hariç herkese iletilmelidir. Yayın mantığını ağdan ayırmak test etmeyi kolaylaştırır: fonksiyon herhangi bir Write listesine yazsın. Gerçek sunucuda liste TcpStream'lerden, testte Vec<u8> tamponlarından oluşur:

fn yayinla<W: Write>(istemciler: &mut [W], gonderen: usize, mesaj: &str) {
    for (i, w) in istemciler.iter_mut().enumerate() {
        if i != gonderen {
            let _ = writeln!(w, "{mesaj}");   // kopan istemci herkesi durdurmasın
        }
    }
}

Bellek içi test

Vec<u8> Write uyguladığı için ağ olmadan yayını deneyebiliriz:

let mut tamponlar: Vec<Vec<u8>> = vec![Vec::new(); 3];
yayinla(&mut tamponlar, 0, "ece: selam");
for (i, t) in tamponlar.iter().enumerate() {
    let metin = String::from_utf8_lossy(t);
    println!("{i}: {}", if metin.is_empty() { "-" } else { metin.trim() });
}

Bu, iş mantığını G/Ç'den ayırmanın (sans-IO tasarımı) küçük bir örneğidir.

Uygulama Yayın

Yukarıdaki generic yayinla fonksiyonunu yaz. Üç Vec<u8> tamponuna, 0 numaralı gönderenden ece: selam mesajını yay ve her tamponu i: içerik (boşsa -) biçiminde yazdır.

Başlangıç kodu

main.rs
use std::io::Write;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::io::Write;

fn yayinla<W: Write>(istemciler: &mut [W], gonderen: usize, mesaj: &str) {
    for (i, w) in istemciler.iter_mut().enumerate() {
        if i != gonderen {
            let _ = writeln!(w, "{mesaj}");
        }
    }
}

fn main() {
    let mut tamponlar: Vec<Vec<u8>> = vec![Vec::new(); 3];
    yayinla(&mut tamponlar, 0, "ece: selam");
    for (i, t) in tamponlar.iter().enumerate() {
        let metin = String::from_utf8_lossy(t);
        println!("{}: {}", i, if metin.is_empty() { "-" } else { metin.trim() });
    }
}

Beklenen çıktı

0: -
1: ece: selam
2: ece: selam

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Yazma hatasını <code>?</code> ile yaymak yerine yok saymanın nedeni nedir?

  • Derleyici zorlar
  • Bağlantısı kopan tek bir istemci yüzünden diğerlerine mesaj gitmemesi önlenir Doğru cevap
  • Hatalar önemsizdir
  • Write hata döndürmez

Açıklama: Gerçek sunucuda başarısız yazan istemciler listeden çıkarılmak üzere işaretlenir.

2 Gönderen hariç

Soru
for (i, w) in istemciler.iter_mut().enumerate() {
    if i ____ gonderen {
        let _ = writeln!(w, "{mesaj}");
    }
}
Cevap
for (i, w) in istemciler.iter_mut().enumerate() {
    if i != gonderen {
        let _ = writeln!(w, "{mesaj}");
    }
}

Açıklama: Mesaj gönderen dışındaki herkese yazılır.

3 İstemci ve aldığı (gönderen 0)

Kavram Anlamı
0 -
1 ece: selam
writeln! hatası Yok sayılır
Vec<u8> Write uygular

İleri seviye bölümündeki tüm dersler