Я пишу простой чат-сервер, который передает сообщения всем подключенным клиентам.
Код может выглядеть ужасно, так как я новичок.Одноранговые узлы еще нигде не используются, поскольку я также хочу передать их в функцию handle_client
, поэтому, когда данные будут доступны в потоке и успешно прочитаны, я хочу передать их всем подключенным клиентам.Я понимаю, что это не очень хороший подход, я просто пытаюсь понять, как я могу делать такие вещи в общем.
use std::io::BufRead;
use std::io::Write;
use std::net::{TcpListener, TcpStream};
use std::sync::Arc;
fn handle_client(arc: Arc<TcpStream>) -> std::io::Result<()> {
let mut stream = Arc::try_unwrap(arc).unwrap();
stream.write(b"Welcome to the server!\r\n")?;
println!("incomming connection: {:?}", stream);
std::thread::spawn(move || -> std::io::Result<()> {
let peer_addr = stream.peer_addr()?;
let mut reader = std::io::BufReader::new(stream);
let mut buf = String::new();
loop {
let bytes_read = reader.read_line(&mut buf)?;
if bytes_read == 0 {
println!("client disconnected {}", peer_addr);
return Ok(());
}
buf.remove(bytes_read - 1);
println!("{}: {}", peer_addr, buf);
buf.clear();
}
});
Ok(())
}
fn start() -> std::io::Result<()> {
let listener = TcpListener::bind("0.0.0.0:1111")?;
println!("listening on {}", listener.local_addr()?.port());
let mut peers: Vec<Arc<TcpStream>> = vec![];
for stream in listener.incoming() {
let mut stream = stream.unwrap();
let arc = Arc::new(stream);
peers.push(arc.clone());
handle_client(arc.clone()).unwrap();
}
Ok(())
}
fn main() -> std::io::Result<()> {
start()
}
Он компилируется нормально, но let mut stream = Arc::try_unwrap(arc).unwrap();
в функции handle_client
паникует,Что я делаю неправильно?Почему это паникует?