Rust TcpStream读取后无法写入,未读取却正常的原因?
问题原因解析
核心问题出在stream.read_to_end(&mut data_buf)这个调用的行为上:
read_to_end的设计逻辑是**持续从TCP流读取数据,直到连接被对方关闭(收到EOF信号)**才会停止并返回。- 但浏览器遵循HTTP/1.1协议,默认会启用持久连接(Keep-Alive)——发送完请求后不会立刻关闭TCP连接,而是保持连接打开,等待后续可能的请求,或者等待服务器主动关闭连接。
你的代码卡在read_to_end这一步,一直等待浏览器关闭连接,根本没机会执行后面的stream.write_all发送响应,所以浏览器页面会一直处于挂起等待状态。
当你移除read_to_end后,代码直接跳过读取步骤,立刻执行响应发送逻辑,浏览器能正常收到HTTP响应,页面自然就正常显示了。
如果要正确处理HTTP请求,不能用read_to_end,而是要按照HTTP协议规则读取请求:比如先读取请求头,直到遇到\r\n\r\n的空行就判断请求头结束,再根据是否有Content-Length等字段决定是否读取请求体,这样就能在合适的时机停止读取,继续处理响应。
内容的提问来源于stack exchange,提问作者Manu Soman
相关产品推荐
相关产品推荐

