#服务器 #数据流 #异步 #RPC #全双工

kumoko

基于 tokio 构建的简单异步服务器/客户端 crate,便于双向流传输

13 个版本

0.6.0 2023年6月28日
0.5.6 2022年12月7日
0.5.5 2022年10月27日
0.5.3 2022年8月15日
0.3.4 2022年7月26日

#606异步

每月47 次下载

MIT/Apache

30KB
560

库莫科

基于 tokio 构建的简单异步服务器/客户端 crate,便于双向流传输。

crates-badge docs.rs license

网站 | API 文档

不稳定警告!

  • 早期开发阶段
  • 文档不完整
  • 测试有限

动机

在 Rust 服务器和客户端之间启用半复杂数据结构的异步全双工流。gRPC 实现对这并不理想

  • 不必要的复杂性
  • 讨厌的协议缓冲区
  • 数据限制,例如没有枚举

特性

  • 许多客户端可以异步与服务器通信
  • 每个客户端都有一个全双工连接
  • 任何实现了 Message 的数据结构都可以传输
trait Message: Send + Encode + Decode + 'static

示例

在您的 Cargo.toml 中

[dependencies]
kumoko = "0.5"
tokio = { version = "1.20", features = ["macros", "rt-multi-thread"] }

最小客户端

use kumoko::client::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = Client::connect("[::1]:50052").await?;

    client.emit_request("Ferris".to_string()).await;
    let msg: String = client.get_response().await.unwrap();
    println!("{}", msg);

    Ok(())
}

最小服务器

use kumoko::server::Server;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut server = Server::<String, String>::bind("[::1]:50052").await?;
    
    loop{
        let (req, origin) = server.get_request().await;

        let msg = format!("Hello {}! Happy to see you here!", req);
        server.emit_response(msg, origin.into()).await;
    }
}

依赖项

~3–15MB
~135K SLoC