问题描述
我正在研究Rust编程语言的最后一章的开始,该章正在教如何使用Rust编写HTTP响应。
由于某些原因,除非在调用TcpResponse::flush()
之前让Rust等待,否则正在发送的HTML文件不会显示在浏览器中。
代码如下:
use std::io::prelude::*;
use std::net::TcpListener;
use std::net::Tcpstream;
use std::fs;
use std::thread::sleep;
use std::time::Duration;
fn main() {
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
for stream in listener.incoming() {
let stream = stream.unwrap();
handle_connection(stream);
}
}
fn handle_connection(mut stream: Tcpstream) {
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let contents = fs::read_to_string("hello.html").unwrap();
let response = format!(
"HTTP/1.1 200 OK\r\nContent-Length: {}\r\n{}",contents.len(),contents
);
stream.write(response.as_bytes()).unwrap();
// let i = stream.write(response.as_bytes()).unwrap();
// println!("{} bytes written to the stream",i);
// ^^ using this code instead will sometimes make it display properly
sleep(Duration::from_secs(1));
// ^^ uncommenting this will cause a blank page to load.
stream.flush().unwrap();
}
我在多个浏览器中观察到相同的行为。
根据Rust的书,调用TcpListener::flush
应该确保字节完成写入流。那么,为什么除非刷新之前我不休眠线程,否则为什么无法在浏览器中查看HTML文件?
我已经完成了重装,并多次使用cargo run
重新启动服务器,并且行为是相同的。我还已经将文件内容打印到终端上,无论在哪种情况下(当然都是),都可以正常读取内容。
我想知道我的操作系统是否有问题。我在Windows 10上。
我可以继续学习(并没有打算立即将实际的Web项目投入生产),因此并没有真正阻止该项目,但是我希望任何人对这个问题有任何见解。关于Rust对流或环境的处理一定是我不了解的。
感谢您的时间!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)