11个版本
使用旧的Rust 2015
0.0.12 | 2016年3月23日 |
---|---|
0.0.11 | 2015年5月31日 |
0.0.9 | 2015年2月23日 |
0.0.6 | 2015年1月28日 |
0.0.1 | 2014年11月23日 |
#114 in #tcp
12KB
231 行
Wire
在TCP和序列化之上的抽象
"将一个结构体放在一边,它从另一边出来"
Wire是一个库,它使编写通过TCP进行通信的应用程序变得容易。如果您曾经想过将一个结构体放入TCP流的一端,并希望它在另一端出来,那么Wire可能就是您要找的东西!
##Api文档
示例
让我们编写一个简单的服务器,它作为一个服务计算斐波那契数。
这些文件可以在examples
目录中找到。
服务器
extern crate wire;
use std::thread::spawn;
use wire::SizeLimit;
fn fib(n: u64) -> u64 {
match n {
0 => 0,
1 => 1,
n => fib(n - 1) + fib(n - 2)
}
}
fn main() {
// Make a listener on 0.0.0.0:8080
let (listener, _) = wire::listen_tcp(("0.0.0.0", 8080)).unwrap();
// Only allow incoming messages of at max 8 bytes, and verify that we aren't
// writing anything over 16 bytes.
let (read_limit, write_limit) = (SizeLimit::Bounded(8),
SizeLimit::Bounded(16));
// Turn the listener into an iterator of connections.
for (connection, _) in listener.into_blocking_iter() {
// Spawn a new thread for each connection that we get.
spawn(move || {
// Upgrade the connection to read `u64` and write `(u64, u64)`.
let (i, mut o) = wire::upgrade_tcp(connection, read_limit, write_limit).unwrap();
// For each `u64` that we read from the network...
for x in i.into_blocking_iter() {
// Send that number back with the computed value.
o.send(&(x, fib(x))).ok();
}
});
}
}
客户端
extern crate wire;
use wire::SizeLimit;
fn main() {
// Only allow incomming messages of at max 16 bytes, and verify that all of
// our outgoing messages aren't over 8 bytes.
let (read_limit, write_limit) = (SizeLimit::Bounded(16),
SizeLimit::Bounded(8));
// Connect to our running fib-server.
// incoming: (u64, u64)
// outgoing: u64
let (i, mut o) = wire::connect_tcp(("localhost", 8080), read_limit, write_limit).unwrap();
// Send all the numbers from 0 to 10.
for x in 0u64 .. 10u64 {
o.send(&x).ok();
}
// Close our outgoing pipe. This is necessary because otherwise,
// the server will keep waiting for the client to send it data and
// we will deadlock.
o.close();
// Print everything that we get back.
for a in i.into_blocking_iter() {
let (x, fx): (u64, u64) = a;
println!("{} -> {}", x, fx);
}
}
依赖关系
~1.5MB
~30K SLoC