【发布时间】:2019-07-07 01:41:34
【问题描述】:
考虑以下代码:
extern crate tokio; // Executor runtime
use tokio::prelude::*;
use tokio::net::TcpListener;
use std::net::SocketAddr;
fn main() {
let addr = "127.0.0.1:8118".parse::<SocketAddr>().unwrap();
let listener = TcpListener::bind(&addr)
.expect("unable to bind TCP listener");
tokio::run(listener.incoming()
.map_err(|e| eprintln!("failed to accept socket; error = {:?}", e))
.for_each(|mut socket| {
let mut buf = vec![];
socket.read_to_end(&mut buf).unwrap();
println!("Received: {:#?}", buf);
Ok(())
})
);
}
当我运行它并向端口 8118 发送一些东西时,我收到以下错误:
thread 'tokio-runtime-worker-0' panicked at 'called `Result::unwrap()` on an `Err` value: Kind(WouldBlock)', src/libcore/result.rs:997:5
我想有一些方法可以将我的套接字置于阻塞模式,或者可能会捕获错误并对其进行处理。我想知道解决这个问题的标准规范方法是什么。
我宁愿不阻塞,因为我希望服务器在等待客户端的同时做其他事情,所以异步/线程解决方案会很棒。
【问题讨论】:
-
某种方式让我的套接字进入阻塞模式——也许你不想使用 Tokio,它存在的全部目的是允许异步 IO。 ..
-
我不希望 IO 阻塞应用程序的其余部分,所以我想要异步或线程。更具体地说,服务器应该能够坐在那里监听内容(稍后将其添加到频道中),而服务器的其余部分继续做事。
标签: rust rust-tokio