Add IO example with async-io
This commit is contained in:
parent
deffc857ef
commit
2dfe035ee0
|
@ -6,3 +6,7 @@ edition = "2021"
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
|
||||
[dev-dependencies]
|
||||
async-io = "1.6.0"
|
||||
futures-lite = "1.12.0"
|
||||
|
|
58
examples/io.rs
Normal file
58
examples/io.rs
Normal file
|
@ -0,0 +1,58 @@
|
|||
use async_io::{Async, Timer};
|
||||
use futures_lite::{AsyncReadExt, AsyncWriteExt};
|
||||
use safe_executor::Executor;
|
||||
use std::net::TcpListener;
|
||||
use std::time::Duration;
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let executor = Executor::new();
|
||||
|
||||
for _ in 0..4 {
|
||||
let execu2r = executor.clone();
|
||||
std::thread::spawn(move || {
|
||||
async_io::block_on(execu2r);
|
||||
});
|
||||
}
|
||||
|
||||
let execu2r = executor.clone();
|
||||
executor.spawn(async move {
|
||||
let listener = match Async::<TcpListener>::bind(([127, 0, 0, 1], 3456)) {
|
||||
Ok(listener) => listener,
|
||||
Err(_) => return,
|
||||
};
|
||||
|
||||
println!("Listening on port 3456");
|
||||
|
||||
loop {
|
||||
let (mut stream, _addr) = match listener.accept().await {
|
||||
Ok(tup) => tup,
|
||||
Err(_) => return,
|
||||
};
|
||||
|
||||
execu2r.spawn(async move {
|
||||
let mut buffer = [0; 1024];
|
||||
|
||||
while let Ok(n) = stream.read(&mut buffer).await {
|
||||
if n == 0 {
|
||||
break;
|
||||
}
|
||||
|
||||
println!("{:?}", &buffer[0..n]);
|
||||
|
||||
if stream.write_all(&buffer[0..n]).await.is_err() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
let execu2r = executor.clone();
|
||||
executor.spawn(async move {
|
||||
Timer::after(Duration::from_secs(60 * 2)).await;
|
||||
execu2r.stop();
|
||||
});
|
||||
|
||||
async_io::block_on(executor);
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in a new issue