Rust
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.
Örnek çözümü göster
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() });
}
}
Kendini test et
-
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
- Hatalar önemsizdir
- Write hata döndürmez
Cevabı göster
Bağlantısı kopan tek bir istemci yüzünden diğerlerine mesaj gitmemesi önlenir — Gerçek sunucuda başarısız yazan istemciler listeden çıkarılmak üzere işaretlenir.
-
Gönderen hariç
for (i, w) in istemciler.iter_mut().enumerate() {
if i ____ gonderen {
let _ = writeln!(w, "{mesaj}");
}
}
Cevabı göster
for (i, w) in istemciler.iter_mut().enumerate() {
if i != gonderen {
let _ = writeln!(w, "{mesaj}");
}
}
-
İstemci ve aldığı (gönderen 0)
- 0
- -
- 1
- ece: selam
- writeln! hatası
- Yok sayılır
- Vec<u8>
- Write uygular
Sıradaki ders: Arc<Mutex> durumu