15个不稳定版本 (6个破坏性更新)

0.7.0 2024年4月2日
0.6.1 2024年2月10日
0.5.1 2024年2月3日
0.4.1 2023年3月20日
0.3.0 2022年7月30日

#1289 in 网络编程

Download history 2/week @ 2024-07-01 62/week @ 2024-07-29

每月 62 次下载

MIT 许可证

170KB
3K SLoC

Rust数据传输协议

适用于Rust的跨平台网络接口。

数据传输协议

数据传输协议(DTP)是一个更大的项目,旨在让任何语言都能进行便捷的网络编程。请参阅完整项目这里

安装

Cargo.toml中添加包

rustdtp = "0.7"

创建服务器

可以使用Server实现来构建服务器

use rustdtp::*;

#[tokio::main]
async fn main() {
    // Create a server that receives strings and returns the length of each string
    let (mut server, mut server_events) = Server::builder()
        .sending::<usize>()
        .receiving::<String>()
        .with_event_channel()
        .start(("0.0.0.0", 0))
        .await
        .unwrap();

    // Iterate over events
    while let Ok(event) = server_events.next().await {
        match event {
            ServerEvent::Connect { client_id } => {
                println!("Client with ID {} connected", client_id);
            }
            ServerEvent::Disconnect { client_id } => {
                println!("Client with ID {} disconnected", client_id);
            }
            ServerEvent::Receive { client_id, data } => {
                // Send back the length of the string
                server.send(client_id, data.len()).await.unwrap();
            }
            ServerEvent::Stop => {
                // No more events will be sent, and the loop will end
                println!("Server closed");
            }
        }
    }
}

创建客户端

可以使用Client实现来构建客户端

use rustdtp::*;

#[tokio::main]
async fn main() {
    // Create a client that sends a message to the server and receives the length of the message
    let (mut client, mut client_events) = Client::builder()
        .sending::<String>()
        .receiving::<usize>()
        .with_event_channel()
        .connect(("127.0.0.1", 29275))
        .await
        .unwrap();

    // Send a message to the server
    let msg = "Hello, server!".to_owned();
    client.send(msg.clone()).await.unwrap();

    // Receive the response
    match client_events.next().await.unwrap() {
        ClientEvent::Receive { data } => {
            // Validate the response
            println!("Received response from server: {}", data);
            assert_eq!(data, msg.len());
        }
        event => {
            // Unexpected response
            panic!("expected to receive a response from the server, instead got {:?}", event);
        }
    }
}

安全性

信息安全是内置的。通过网络接口发送的每条消息都使用AES-256进行加密。密钥交换使用2048位RSA密钥对进行。

依赖关系

~8–15MB
~191K SLoC