如何测试Rust HTTP服务器中的TCP stream.read()函数?
测试Rust简易HTTP服务器的stream.read()及连接等待状态
你已经完成了基础的TCP服务器搭建,编译运行正常,接下来可以通过以下方式验证连接等待状态和测试stream.read()函数:
一、验证服务器是否在等待新连接
直接观察终端输出
运行服务器后,终端打印出Listening on {地址} !!!!凸(⊙▂⊙✖ )!!!!后,程序会卡在listener.accept()调用处,此时就是在等待新的TCP连接,不会继续输出其他内容,这就说明服务器处于等待状态。用端口监听状态确认
在另一个终端执行对应系统的命令,查看目标端口的监听状态:
- Linux/macOS:
netstat -an | grep <你的端口号>或ss -tulwn | grep <你的端口号>,如果输出中包含LISTEN,则说明端口正在被监听,服务器在等待连接。 - Windows:打开命令提示符,运行
netstat -ano | findstr <你的端口号>,如果结果里状态为LISTENING,即可确认。
二、测试stream.read()函数
stream.read()是阻塞式调用,会等待直到从连接中读取到数据,以下两种方法可以快速测试:
方法1:用curl发送HTTP请求
假设你的服务器监听地址是127.0.0.1:8080,在另一个终端执行:
curl http://127.0.0.1:8080
此时服务器会读取到curl发送的HTTP请求,终端会打印出类似Recieved a request: GET / HTTP/1.1...的内容。
方法2:用telnet手动构造请求
- 在终端运行
telnet 127.0.0.1 8080,成功连接后会进入交互模式。 - 手动输入HTTP请求内容:
GET /test HTTP/1.1 Host: 127.0.0.1:8080
注意最后需要输入一个空行(按两次回车),此时服务器会读取到你输入的请求并打印出来。
你的Server模块代码(已修正小问题)
use ::std::io::Read; use std::net::TcpListener; pub struct Server_Node { address: String, } impl Server_Node { pub fn new(address: String) -> Self { Server_Node { address } } pub fn run(self) { println!("Listening on {} !!!!凸(⊙▂⊙✖ )!!!!", self.address); let listener = TcpListener::bind(&self.address).unwrap(); loop { match listener.accept() { Ok((mut _stream, _)) => { let mut buffer = [0; 1024]; match _stream.read(&mut buffer) { Ok(_) => { println!("Recieved a request: {}", String::from_utf8_lossy(&buffer)); } Err(e) => println!("FAILED TO READ FROM CONNECTION: {}", e), } } Err(e) => println!("ERROR: FAILED TO ESTABLISH CONNECTION :{} ", e), } } } }
(注:修正了代码里Err((e))多余的括号,以及拼写错误FVROM)
内容的提问来源于stack exchange,提问作者GoodbyeFrog
相关产品推荐
相关产品推荐

