Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpSoSe 261 of 288 menu
◀ ▶

Несколько клиентов TCP в Rust

Один слушатель может принимать много соединений за время работы программы. Цикл вокруг приема берет следующего гостя, пока процесс не завершат или не прервут ошибкой.

Такой цикл обслуживает клиентов по очереди, а не одновременно: пока обрабатывается один поток, остальные ждут в очереди ядра. Для параллельной работы нужны отдельные механизмы, здесь же все шаги идут в одном потоке управления программы.

Примем двух гостей подряд и для каждого выведем адрес:

use std::net::TcpListener; fn main() { let listener = match TcpListener::bind("127.0.0.1:7000") { Ok(l) => l, Err(e) => { eprintln!("bind error: {}", e); return; } }; for _ in 0..2 { let (stream, peer) = match listener.accept() { Ok(pair) => pair, Err(e) => { eprintln!("accept error: {}", e); return; } }; println!("client {}", peer); drop(stream); } println!("done"); }

После работы с потоком его можно явно закрыть, чтобы освободить ресурс и перейти к следующему ожиданию. Пока первый гость не отработан, второй не получит внимания программы, хотя подключиться мог раньше.

Добавим короткое чтение в теле цикла, чтобы видеть данные от каждого:

use std::io::Read; use std::net::TcpListener; fn main() { let listener = match TcpListener::bind("127.0.0.1:7000") { Ok(l) => l, Err(e) => { eprintln!("bind error: {}", e); return; } }; loop { let (mut stream, peer) = match listener.accept() { Ok(pair) => pair, Err(e) => { eprintln!("accept error: {}", e); break; } }; let mut buf = [0u8; 32]; let n = match stream.read(&mut buf) { Ok(count) => count, Err(e) => { eprintln!("read error: {}", e); continue; } }; match std::str::from_utf8(&buf[..n]) { Ok(text) => println!("{} says {}", peer, text), Err(_) => println!("{} bad utf8", peer), } } }

Дан адрес:

let addr = "127.0.0.1:7000";

Примите ровно трех гостей в цикле и для каждого выведите hello на отдельной строке.

Дан адрес:

let addr = "127.0.0.1:7000";

В цикле примите гостя, прочитайте буфер, выведите текст и закройте поток перед следующим ожиданием.

Скажите, почему при таком цикле второй клиент может ждать дольше первого, даже если подключился почти сразу.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить