#客户端-服务器 #数据包 #对等 # #异步 #async-std #rak-net

rak-rs

纯Rust编写的完全功能的RakNet实现,异步驱动。

5个版本

0.3.3 2024年4月28日
0.3.3-beta.12024年3月17日
0.3.2 2024年1月27日
0.3.1 2023年9月18日
0.3.0 2023年8月21日

#982 in 网络编程

每月 40 次下载

Apache-2.0

265KB
4.5K SLoC

rak-rs

纯Rust编写的完全功能的RakNet实现,异步驱动。

入门

RakNet (rak-rs) 在 crates.io 上可用,要使用它,请在您的 Cargo.toml 中添加以下内容

[dependencies]
rak-rs = "0.3.3"

功能

此RakNet实现包含3个主要功能,async_stdasync_tokiomcpe。但是,默认情况下,仅启用 async_std,并且 mcpe 需要您修改您的 Cargo.toml

如果您希望使用这些功能,请像下面这样将它们添加到您的 Cargo.toml

[dependencies]
rak-rs = { version = "0.3.3", default-features = false, features = [ "async_tokio", "mcpe" ] }

rak-rs 还提供了以下模块

客户端

client 模块提供了一种通过代码与RakNet服务器交互的方式。

示例

use rak_rs::client::{Client, DEFAULT_MTU};
use std::net::ToSocketAddrs;

#[async_std::main]
async fn main() {
    let version: u8 = 10;
    let mut client = Client::new(version, DEFAULT_MTU);

    client.connect("my_server.net:19132").await.unwrap();

    // receive packets
    loop {
        let packet = client.recv().await.unwrap();

        println!("Received a packet! {:?}", packet);

        client.send_ord(vec![254, 0, 1, 1], Some(1));
    }
}

服务器

纯Rust编写的RakNet服务器实现。

示例

use rakrs::connection::Connection;
use rakrs::Listener;
use rakrs::

#[async_std::main]
async fn main() {
    let mut server = Listener::bind("0.0.0.0:19132").await.unwrap();
    server.start().await.unwrap();

    loop {
        let conn = server.accept().await;
        async_std::task::spawn(handle(conn.unwrap()));
    }
}

async fn handle(mut conn: Connection) {
    loop {
        // keeping the connection alive
        if conn.is_closed() {
            println!("Connection closed!");
            break;
        }
        if let Ok(pk) = conn.recv().await {
            println!("Got a connection packet {:?} ", pk);
        }
    }
}

依赖项

~4–16MB
~201K SLoC