4 个版本
使用旧 Rust 2015
0.1.3 | 2016年6月23日 |
---|---|
0.1.2 | 2016年5月30日 |
0.1.1 | 2016年5月11日 |
0.1.0 | 2016年4月24日 |
在 异步 中排名 1361
每月下载 27 次
用于 capnp-gj
60KB
1K SLoC
干得好,伙计
基于 gj 事件循环 的异步输入和输出。
在 Linux 上使用 epoll
,在 OSX 上使用 kqueue
,在 Windows 上使用 I/O 完成端口。
lib.rs
:
异步输入和输出。
示例
extern crate gj;
extern crate gjio;
use gj::{EventLoop, Promise};
use gjio::{AsyncRead, AsyncWrite, BufferPrefix, SocketStream};
fn echo(mut stream: SocketStream, buf: Vec<u8>) -> Promise<(), ::std::io::Error> {
stream.try_read(buf, 1).then(move |(buf, n)| {
if n == 0 { // EOF
Promise::ok(())
} else {
stream.write(BufferPrefix::new(buf, n)).then(move |prefix| {
echo(stream, prefix.buf)
})
}
})
}
fn main() {
EventLoop::top_level(|wait_scope| -> Result<(), ::std::io::Error> {
let mut event_port = try!(gjio::EventPort::new());
let network = event_port.get_network();
let mut listen_address = network.get_tcp_address(
::std::str::FromStr::from_str("127.0.0.1:0").unwrap());
let listener = try!(listen_address.listen());
let connect_address = network.get_tcp_address(try!(listener.local_addr()));
let promise1 = listener.accept().then(move |stream| {
echo(stream, vec![0;5]) // Tiny buffer just to be difficult
});
let promise2 = connect_address.connect().then(move |mut stream| {
stream.write(b"hello world").then(move |_| {
stream.read(vec![0; 11], 11).map(|(buf, _)| {
assert_eq!(buf, b"hello world");
Ok(())
})
})
});
let all = Promise::all(vec![promise1, promise2].into_iter());
try!(all.wait(wait_scope, &mut event_port));
Ok(())
}).expect("top level");
}
依赖项
~2.5MB
~51K SLoC