use smux_rust::{client, server, Config};
use tokio::net::{TcpListener, TcpStream};
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = Config {
version: 2, keep_alive_disabled: false,
keep_alive_interval: Duration::from_secs(5), keep_alive_timeout: Duration::from_secs(15), max_frame_size: 16384, max_receive_buffer: 2_097_152, max_stream_buffer: 32768, };
config.verify()?;
println!("配置验证通过");
let server_config = config.clone();
let server_handle = tokio::spawn(async move {
custom_config_server(server_config).await.unwrap();
});
tokio::time::sleep(tokio::time::Duration::from_millis(1)).await;
custom_config_client(config).await?;
server_handle.await.unwrap();
Ok(())
}
async fn custom_config_server(config: Config) -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:8082").await?;
println!("自定义配置服务器监听在 127.0.0.1:8082");
println!("配置: 版本={}, 最大帧={}B, 接收缓冲区={}B",
config.version, config.max_frame_size, config.max_receive_buffer);
loop {
let (tcp_conn, _) = listener.accept().await?;
let session = server(Box::new(tcp_conn), Some(config.clone())).await?;
if let Ok(mut stream) = session.accept_stream().await {
let mut buf = [0u8; 1024];
if let Ok(n) = stream.read(&mut buf).await {
println!("收到: {}", String::from_utf8_lossy(&buf[..n]));
stream.write_all(b"Response with custom config").await?;
}
stream.close().await?;
}
session.close().await?;
}
}
async fn custom_config_client(config: Config) -> Result<(), Box<dyn std::error::Error>> {
let tcp_conn = TcpStream::connect("127.0.0.1:8082").await?;
let session = client(Box::new(tcp_conn), Some(config)).await?;
let mut stream = session.open_stream().await?;
stream.write_all(b"Hello with custom config").await?;
let mut buf = [0u8; 1024];
if let Ok(n) = stream.read(&mut buf).await {
println!("收到: {}", String::from_utf8_lossy(&buf[..n]));
}
stream.close().await?;
session.close().await?;
Ok(())
}