use tokio::io::{AsyncReadExt, AsyncWriteExt};
use uni_stream::stream::{
ListenerProvider, StreamAccept, TcpListenerProvider, UdpListenerProvider,
};
async fn echo_server<P: ListenerProvider>(
server_addr: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let listener = P::bind(server_addr).await?;
println!("run local server:{server_addr}");
loop {
let (mut stream, addr) = listener.accept().await?;
println!("Connected from {addr}");
tokio::spawn(async move {
let mut buf = vec![0; 1024];
loop {
let n = match stream.read(&mut buf).await {
Ok(n) => n,
Err(e) => {
println!("Error reading: {e}");
return;
}
};
if n == 0 {
return;
}
if let Err(e) = stream.write_all(&buf[..n]).await {
println!("Error writing: {e}");
return;
}
println!("Echoed {n} bytes to {addr}");
}
});
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let run_udp: bool = true;
if run_udp {
echo_server::<UdpListenerProvider>("0.0.0.0:8080").await
} else {
echo_server::<TcpListenerProvider>("0.0.0.0:8080").await
}
}