use smux_rust::{client, server};
use tokio::net::{TcpListener, TcpStream};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let server_handle = tokio::spawn(async {
server_example().await.unwrap();
});
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
client_example().await?;
server_handle.await.unwrap();
Ok(())
}
async fn server_example() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
println!("服务器监听在 127.0.0.1:8080");
loop {
match listener.accept().await {
Ok((tcp_conn, _)) => {
println!("接受新连接");
let session = server(Box::new(tcp_conn), None).await?;
match session.accept_stream().await {
Ok(mut stream) => {
println!("接受新流: {}", stream.id());
let mut buf = [0u8; 1024];
match stream.read(&mut buf).await {
Ok(n) => {
println!("收到数据: {}", String::from_utf8_lossy(&buf[..n]));
stream.write_all(b"Hello from server!").await?;
}
Err(e) => {
eprintln!("读取错误: {}", e);
}
}
stream.close().await?;
}
Err(e) => {
eprintln!("接受流错误: {}", e);
}
}
session.close().await?;
}
Err(e) => {
eprintln!("连接错误: {}", e);
}
}
}
}
async fn client_example() -> Result<(), Box<dyn std::error::Error>> {
println!("客户端连接到 127.0.0.1:8080");
let tcp_conn = TcpStream::connect("127.0.0.1:8080").await?;
let session = client(Box::new(tcp_conn), None).await?;
println!("客户端会话已创建");
let mut stream = session.open_stream().await?;
println!("打开流: {}", stream.id());
let message = b"Hello from client!";
stream.write_all(message).await?;
println!("发送数据: {}", String::from_utf8_lossy(message));
let mut buf = [0u8; 1024];
match stream.read(&mut buf).await {
Ok(n) => {
println!("收到响应: {}", String::from_utf8_lossy(&buf[..n]));
}
Err(e) => {
eprintln!("读取错误: {}", e);
}
}
stream.close().await?;
println!("流已关闭");
session.close().await?;
println!("会话已关闭");
Ok(())
}