文章目录
- 一、创建一个具有监听链接功能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?);
}
//成功返回空括号的result
Ok(())
}
- 操作效果:
二、读取请求内容
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?);
}
//成功返回空括号的result
Ok(())
}
三、编写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?);
}
//成功返回空括号的result
Ok(())
}
四、编写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?);
}
//成功返回空括号的result
Ok(())
}