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 {
multi_stream_server().await.unwrap();
});
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
multi_stream_client().await?;
server_handle.await.unwrap();
Ok(())
}
async fn multi_stream_server() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:8081").await?;
println!("多流服务器监听在 127.0.0.1:8081");
loop {
let (tcp_conn, _) = listener.accept().await?;
let session = server(Box::new(tcp_conn), None).await?;
for i in 0..3 {
match session.accept_stream().await {
Ok(mut stream) => {
println!("服务器接受流 {}: {}", i, stream.id());
let mut buf = [0u8; 1024];
if let Ok(n) = stream.read(&mut buf).await {
let message = format!("Echo: {}", String::from_utf8_lossy(&buf[..n]));
stream.write_all(message.as_bytes()).await?;
}
stream.close().await?;
}
Err(e) => {
eprintln!("接受流错误: {}", e);
break;
}
}
}
session.close().await?;
}
}
async fn multi_stream_client() -> Result<(), Box<dyn std::error::Error>> {
let tcp_conn = TcpStream::connect("127.0.0.1:8081").await?;
let session = client(Box::new(tcp_conn), None).await?;
let mut streams = Vec::new();
for i in 0..3 {
let stream = session.open_stream().await?;
println!("客户端打开流 {}: {}", i, stream.id());
streams.push(stream);
}
for (i, mut stream) in streams.into_iter().enumerate() {
let message = format!("Message from stream {}", i);
stream.write_all(message.as_bytes()).await?;
println!("流 {} 发送: {}", i, message);
let mut buf = [0u8; 1024];
if let Ok(n) = stream.read(&mut buf).await {
println!("流 {} 收到: {}", i, String::from_utf8_lossy(&buf[..n]));
}
stream.close().await?;
}
session.close().await?;
Ok(())
}