smux_rust 0.2.1

A simple multiplexing library for Rust, inspired by xtaci/smux
//! 多流使用示例(异步版本)
//!
//! 这个示例展示了如何在同一个会话中创建和使用多个流

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(())
}