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
51KB
879 行
Rust 守护进程
一个库,用于简化 Rust 中与守护进程的通信,目标是在尽可能多的隐藏复杂性/最小化使用 tokio 的努力。
这包括一个高级通用的 服务器 和 连接 对象,以提供组件之间的类型化通信,使用 tokio 通过 编解码器 实现。这被设计为支持任意流类型,并且两种类型都已在 TCPStream
和 UnixStream
上实现,以便于使用。如果您发现其他有用的流类型要包装,请打开一个问题或 PR!
提供了一个使用 serde 和 serde_json 的通用 编解码器示例,以建立客户端-守护进程通信的类型安全 JSON 接口。当使用此编解码器时,ENC
和 DEC
类型必须实现 serde 的 Serialize
和 Deserialize
特性,这些可以使用 serde_derive 实现。预计在需要时将添加更多编解码器。
状态
使用方法
查看 src/examples/server.rs 和 src/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