Broadcast
- Rust kursu
- İleri seviye
- Ders 28/81
- 6 dk
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
use std::io::Write;
fn main() {
// buraya yaz
}Örnek çözüm
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ç
for (i, w) in istemciler.iter_mut().enumerate() {
if i ____ gonderen {
let _ = writeln!(w, "{mesaj}");
}
}
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 |