#服务器连接 #编解码器 #守护进程 #请求 #通信 #Unix #客户端

程序+库 daemon-engine

Unix Rust 守护进程编写助手包,基于 IPC 客户端

10 个版本 (5 个破坏性更新)

0.6.0 2019年4月10日
0.5.1 2019年3月31日
0.4.0 2019年1月6日
0.3.3 2018年12月31日
0.1.0 2018年8月15日

#1029 in 编码

每月下载量 36

MIT/Apache

51KB
879

Rust 守护进程

一个库,用于简化 Rust 中与守护进程的通信,目标是在尽可能多的隐藏复杂性/最小化使用 tokio 的努力。

这包括一个高级通用的 服务器连接 对象,以提供组件之间的类型化通信,使用 tokio 通过 编解码器 实现。这被设计为支持任意流类型,并且两种类型都已在 TCPStreamUnixStream 上实现,以便于使用。如果您发现其他有用的流类型要包装,请打开一个问题或 PR!

提供了一个使用 serdeserde_json 的通用 编解码器示例,以建立客户端-守护进程通信的类型安全 JSON 接口。当使用此编解码器时,ENCDEC 类型必须实现 serdeSerializeDeserialize 特性,这些可以使用 serde_derive 实现。预计在需要时将添加更多编解码器。

状态

GitHub tag Build Status Crates.io Docs.rs

开放问题

使用方法

查看 src/examples/server.rssrc/examples/client.rs 以获取实现简单键值存储的示例服务器和客户端。

您可以使用以下命令构建这些示例:cargo build --features examples,使用./targets/debug/rustd-server运行服务器,并使用./targets/debug/rustd-client进行交互。rustd-client -k KEY获取给定键的值,rustd-client -k KEY -v VALUE设置给定键的值,使用rustd-client --help将显示可用的参数。

客户端

extern crate daemon_engine;
use daemon_engine::Connection;

...

// Create client instance
let stream = UnixStream::connect(path.clone()).wait().unwrap();
let client = Connection::<_, JsonCodec<Test, Test, JsonError>>::new(stream);

// Split RX and TX
let (tx, rx) = client.split();

// Send something (remember to .wait())
tx.send(Request::Something).wait().unwrap();

// Receive something (also remember to wait)
rx.map(|resp| -> Result<(), DaemonError> {
    println!("Response: {:?}", resp);
    Ok(())
}).wait().next();

服务器

extern crate tokio;
use tokio::prelude::*;
use tokio::{run, spawn};

extern crate daemon_engine;
use daemon_engine::Server;
use daemon_engine::codecs::json::{JsonCodec, JsonError};

...

let server_handle = future::lazy(move || {
    // Create server instance using the JSON codec, this must be executed from within a tokio context
    let mut server = Server::<_, JsonCodec<Request, Response, JsonError>>::new_unix(&server_path).unwrap();

    // Handle requests from clients
    s.incoming().unwrap().for_each(move |r| {
        println!("Request: {:?}", r.data());
        let data = r.data();
        match data {
            ...
            _ => {
                r.send(Response::Something(v.to_string()))
            }
        // Remember you have to .wait or otherwise prompt for send to occur
        }.wait().unwrap();
        Ok(())
    }).map_err(|_e| ());

    // do more stuff
    ...

    // Close the server when you're done
    s.close();

    Ok(())
});

// Create server task
tokio::run(server_handle);

如果您有任何问题、评论或建议,请随时提出问题或发起拉取请求。

依赖项

~9MB
~148K SLoC