文章目录
- 一、创建一个具有监听链接功能web服务器
- 二、读取请求内容
- 三、编写web服务器返回网页(编写响应)
- 四、编写web服务器有条件的返回网页
- 五、编写多线程的web服务器
- 六、用线程池实现web服务器
- 七、实现线程池清除的web服务器
- 八、读取文件
rust官网文档地址:https://doc.rust-lang.org/std
一、创建一个具有监听链接功能web服务器
①监听连接函数
use std::net::{TcpListener,TcpStream};//接受tcp内容做处理
fn handle_client(_stream:TcpStream)
{println!("123455");
}fn main()->std::io::Result<()> {let listener = TcpListener::bind("127.0.0.1:8080")?;//问号表示如果bind成功则创建listener往下走,失败则返回//接受链接并处理for stream in listener.incoming(){handle_client(stream?);}//成功返回空括号的resultOk(())
}
- 操作效果:
二、读取请求内容
use std::net::{TcpListener,TcpStream};
use std::io::*;//接受tcp内容做处理
fn handle_client(mut stream:TcpStream)
{//创建缓冲区来读let mut buffer=[0;512];stream.read(&mut buffer).unwrap();println!("Request:{}",String::from_utf8_lossy(&buffer[..]));
}fn main()->std::io::Result<()> {let listener = TcpListener::bind("127.0.0.1:8080")?;//问号表示如果bind成功则创建listener往下走,失败则返回//接受链接并处理for stream in listener.incoming(){handle_client(stream?);}//成功返回空括号的resultOk(())
}
三、编写web服务器返回网页(编写响应)
- 编写响应
1)返回一个响应行
//返回响应let reponse = "HTTP/1.1 200 OK\r\n\r\n";stream.write(reponse.as_bytes()).unwrap();stream.flush().unwrap();
2)返回一个真正的网页
①创建一个简单的main.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>Hello!</title></head><body><hl>Hello</hl><p>This is a response from a Rust Server</p></body>
</html>
//返回响应let content = fs::read_to_string("main.html").unwrap();//内容加载到响应行里面let reponse = format!("HTTP/1.1 200 OK\r\n\r\n{}",content);stream.write(reponse.as_bytes()).unwrap();stream.flush().unwrap();
- Http简单介绍
1)请求报文:
①请求行:Method 、 Request-URI 、HTTP-Version CRLF// 请求方式、协议版本等
②请求头:headers CRLF //包含若干个属性,格式为:“ 属性名:属性值”
③请求体:message-body //客户端想传给服务器的内容
2)响应报文:
①响应行:HTTP-VERSION Status-Code Reason-Phrase CRLF//报文协议及版本,状态码及状态描述
②响应头:headers CRLF // 多个属性构成
③响应体:message-body // 真正响应的内容
use std::net::{TcpListener,TcpStream};
use std::io::{Read,Write};
use std::fs;//接受tcp内容做处理
fn handle_client(mut stream:TcpStream)
{//创建缓冲区来读let mut buffer=[0;512];stream.read(&mut buffer).unwrap();//打印请求格式println!("Request:{}",String::from_utf8_lossy(&buffer[..]));//返回响应let content = fs::read_to_string("main.html").unwrap();//内容加载到响应行里面let reponse = format!("HTTP/1.1 200 OK\r\n\r\n{}",content);stream.write(reponse.as_bytes()).unwrap();stream.flush().unwrap();}fn main()->std::io::Result<()> {let listener = TcpListener::bind("127.0.0.1:8080")?;//问号表示如果bind成功则创建listener往下走,失败则返回//接受链接并处理for stream in listener.incoming(){handle_client(stream?);}//成功返回空括号的resultOk(())
}
四、编写web服务器有条件的返回网页
1)404Erorr界面的html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>Hello!</title></head><body><hl>Oops</hl><p>Sorry,error!</p></body>
</html>
2)代码示例
use std::net::{TcpListener,TcpStream};
use std::io::{Read,Write};
use std::fs;//接受tcp内容做处理
fn handle_client(mut stream:TcpStream)
{//创建缓冲区来读let mut buffer=[0;512];stream.read(&mut buffer).unwrap();//打印请求格式println!("Request:{}",String::from_utf8_lossy(&buffer[..]));//根据是不是get返回对应内容let get = b"Get / HTTP/1.1/r\n";if buffer.starts_with(get){//返回main.html//返回响应let content = fs::read_to_string("main.html").unwrap();//内容加载到响应行里面let reponse = format!("HTTP/1.1 200 OK\r\n\r\n{}",content);}else{//返回响应let content = fs::read_to_string("404.html").unwrap();//内容加载到响应行里面let reponse = format!("HTTP/1.1 404 NOT FOUND\r\n\r\n{}",content);}stream.write(reponse.as_bytes()).unwrap();stream.flush().unwrap();
}fn main()->std::io::Result<()> {let listener = TcpListener::bind("127.0.0.1:8080")?;//问号表示如果bind成功则创建listener往下走,失败则返回//接受链接并处理for stream in listener.incoming(){handle_client(stream?);}//成功返回空括号的resultOk(())
}