HTTP报文格式
响应报文的格式大致是这样的:
HTTP/1.1 200 OK
Content-Type=text/html
<!DOCTYPE html>
...
第一行是起始行,它声明了使用HTTP协议版本以及响应状态码
第二行开始是响应头信息,响应头和响应体之间用一行空行进行分隔
空行后开始是响应体
响应报文原理
如果要响应一条报文给浏览器,实际上就是封装好一份HTTP报文,并通过tcp协议发送给浏览器。
为此,我们只需要定义一个发送信息的函数,并把报文发送出去就完事了。
代码实现
声明发送响应报文函数
int sendMessage(std::string response);
定义发送响应报文函数
int HttpServer::sendMessage(std::string response)
{
if (SOCKET_ERROR==send(acceptSocket,response.c_str(),response.length(),0))
{
cout<<"send错误"<<endl;
return -1;
}
return 0;
}
写好起始行和响应头,将提前写好的html放在响应体中,并执行发送操作。
//尝试发送一条响应报文
std::string response=
"HTTP/1.1 200 OK\r\n"
"Server:PrivateServer\r\n"
"Content-Type= text/html; charset=UTF-8\r\n"
"\r\n"
"<!DOCTYPE html>"
"<html lang=\"zh-CN\">"
"<head>"
"<meta charset=\"UTF-8\">"
"<title>Hello World</title>"
"<style>"
"h1{text-align: center;}"
"</style>"
"</head>"
"<body>"
"<h1>Hello World</h1>"
"</body>"
"</html>";
sendMessage(response);
结果展示
响应结果如下图:
这里注意一下文件名字为index.html
,实际上这是url决定的,请求什么资源这里就会显示什么名字,你也可以不请求index.html
,而是请求helloWorld.html
。
写在最后
到这里,我们已经实现了接收浏览器发来的请求信息并进行响应,接下来要做的工作就是:
- 分块发送文件。string类型能容纳的大小好像最多是6MB吧,一个html可能很难达到这个大小。但如果是一张图片呢,它可以轻松超过,所以我们需要分多次发送。而这样一来,我们就需要了解HTTP协议的分块发送的一些约定,像是怎么确定发完了最后一个数据块。
- 判断请求类型。我们得判断浏览器发来的请求是GET请求还是HEAD请求还是什么请求,以做出不同的响应处理。
- 自动生成响应头信息。我们需要添加一些信息如服务器类型、日期、内容类型、缓存控制等到响应头中。
- 判断请求的资源是否存在。遍历本地资源目录,如果不存在对应资源就发送404给浏览器。
- 处理异常。在处理请求时,可能会出现错误或异常,我们需要处理它们并向客户端发送适当的错误响应。
- 日志记录。记录请求响应信息,便于后续分析和排除故障。
- 支持并发请求。我们需要支持同时处理多个请求,以便服务器能够同时服务多个客户端请求。
- 处理请求的安全性。我们有时可能需要和浏览器协商好,并加密我们的响应信息,防止被坏人窃听到。
- 实现缓存。对于一些静态资源,我们可以通过使用缓存来提高响应速度和性能。
- 支持HTTPS。如果我们希望通过网络传输敏感信息,就需要支持HTTPS,这可以提供安全的加密通信。
. 实现缓存。对于一些静态资源,我们可以通过使用缓存来提高响应速度和性能。 - 支持HTTPS。如果我们希望通过网络传输敏感信息,就需要支持HTTPS,这可以提供安全的加密通信。
- 优化性能。使用线程池什么的(还没了解),来实现一个高并发服务器。