2.响应一条HTTP报文

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

在这里插入图片描述

写在最后

到这里,我们已经实现了接收浏览器发来的请求信息并进行响应,接下来要做的工作就是:

  1. 分块发送文件。string类型能容纳的大小好像最多是6MB吧,一个html可能很难达到这个大小。但如果是一张图片呢,它可以轻松超过,所以我们需要分多次发送。而这样一来,我们就需要了解HTTP协议的分块发送的一些约定,像是怎么确定发完了最后一个数据块。
  2. 判断请求类型。我们得判断浏览器发来的请求是GET请求还是HEAD请求还是什么请求,以做出不同的响应处理。
  3. 自动生成响应头信息。我们需要添加一些信息如服务器类型、日期、内容类型、缓存控制等到响应头中。
  4. 判断请求的资源是否存在。遍历本地资源目录,如果不存在对应资源就发送404给浏览器。
  5. 处理异常。在处理请求时,可能会出现错误或异常,我们需要处理它们并向客户端发送适当的错误响应。
  6. 日志记录。记录请求响应信息,便于后续分析和排除故障。
  7. 支持并发请求。我们需要支持同时处理多个请求,以便服务器能够同时服务多个客户端请求。
  8. 处理请求的安全性。我们有时可能需要和浏览器协商好,并加密我们的响应信息,防止被坏人窃听到。
  9. 实现缓存。对于一些静态资源,我们可以通过使用缓存来提高响应速度和性能。
  10. 支持HTTPS。如果我们希望通过网络传输敏感信息,就需要支持HTTPS,这可以提供安全的加密通信。
    . 实现缓存。对于一些静态资源,我们可以通过使用缓存来提高响应速度和性能。
  11. 支持HTTPS。如果我们希望通过网络传输敏感信息,就需要支持HTTPS,这可以提供安全的加密通信。
  12. 优化性能。使用线程池什么的(还没了解),来实现一个高并发服务器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值