当前位置:   article > 正文

计算机网络——WEB服务器编程实验

计算机网络——WEB服务器编程实验

实验目的

1. 处理一个 http 请求 2. 接收并解析 http 请求 3. 从服务器文件系统中获得被请求的文件 4. 创建一个包括被请求的文件的 http 响应信息 5. 直接发送该信息到客户端

具体内容

一、C++ 程序来实现 web 服务器功能。

二、用 HTML 语言编写两个 HTML文件,并制作两个网页,来验证 web 服务器能否成功运行。

三、验证处理http请求和应对错误请求显示错误信息两种情况。

实验过程

用HTML 语言编写制作三个简易网页:1. 主页,包括欢迎信息和一个跳转链接;2. 跳转页,包含一个图片和提示信息;3. 404错误处理页,当跳转到无法访问的地址时就来到这个页面。

编写C++代码,使用Boost.Asio库,用来处理 TCP 连接和数据的读写。

使用Boost.Filesystem获取文件的扩展名和检查文件是否存在。监听8888端口的访问以及实现一些获取返回信息和跳转页面的逻辑。然后编译链接运行

​​​​​​​Linux运行在虚拟机环境中,先通过ifconfig获取局域网内的IP:192.168.146.138,然后在物理机上运行浏览器,在地址栏中输入192.168.146.138:8888进入主页,依次测试跳转和输入错误地址的情况。

关键代码讲解

主要处理逻辑代码,首先,它读取请求行(方法、路径和协议),然后根据路径找到相应的文件。如果文件不存在,它会返回一个 404 错误页面;如果文件存在,它会返回文件的内容。主函数中只需创建了一个 TCP 接受器,然后进入一个无限循环,接受新的连接并处理请求。

  1. void handle_request(tcp::socket& socket) {
  2. try {
  3. boost::asio::streambuf request;
  4. boost::asio::read_until(socket, request, "\r\n");
  5. std::string method, path, protocol;
  6. std::istream request_stream(&request);
  7. request_stream >> method >> path >> protocol;
  8. if (path == "/") {
  9. path = "/index.html";
  10. }
  11. std::string full_path = root_dir + path;
  12. std::ifstream file(full_path, std::ios::binary);
  13. boost::asio::streambuf response;
  14. std::ostream response_stream(&response);
  15. if (!file) {
  16. // Open the 404.html file
  17. std::ifstream file_404(root_dir + "/404.html", std::ios::binary);
  18. if (!file_404) {
  19. response_stream << "HTTP/1.0 500 Internal Server Error\r\n";
  20. response_stream << "Connection: close\r\n\r\n";
  21. std::cout << "Response: 500 Internal Server Error" << std::endl;
  22. } else {
  23. response_stream << "HTTP/1.0 404 Not Found\r\n";
  24. response_stream << "Content-Type: text/html\r\n";
  25. response_stream << "Connection: close\r\n\r\n";
  26. response_stream << file_404.rdbuf();
  27. std::cout << "Response: 404 Not Found" << std::endl;
  28. }
  29. }
  30. else {
  31. response_stream << "HTTP/1.0 200 OK\r\n";
  32. response_stream << "Content-Type: " << get_content_type(full_path) << "\r\n";
  33. response_stream << "Connection: close\r\n\r\n";
  34. response_stream << file.rdbuf();
  35. std::cout << "Response: 200 OK, Content-Type: " << get_content_type(full_path) << std::endl;
  36. }
  37. boost::asio::write(socket, response);
  38. socket.shutdown(tcp::socket::shutdown_both);
  39. } catch (boost::system::system_error& e) {
  40. if (e.code() != boost::asio::error::eof) {
  41. throw; // Rethrow if it's not the expected exception.
  42. }
  43. // Handle EOF exception here if necessary.
  44. std::cout << "Connection closed by client." << std::endl;
  45. }
  46. }

运行示例

(1)当输入IP:8888实现访问主页。

(2)当点击“Next Page”,会转到下一个界面,展示预设好的内容。

(3)当输入一个错误的网址时,例如aaa.html,将会显示404界面。

相关代码

BJTU_CS_Learning/computernetwork at main · JJLi0427/BJTU_CS_Learning (github.com)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/406344
推荐阅读
相关标签
  

闽ICP备14008679号