当前位置: 首页 > news >正文

计算机网络——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 接受器,然后进入一个无限循环,接受新的连接并处理请求。

void handle_request(tcp::socket& socket) {try {boost::asio::streambuf request;boost::asio::read_until(socket, request, "\r\n");std::string method, path, protocol;std::istream request_stream(&request);request_stream >> method >> path >> protocol;if (path == "/") {path = "/index.html";}std::string full_path = root_dir + path;std::ifstream file(full_path, std::ios::binary);boost::asio::streambuf response;std::ostream response_stream(&response);if (!file) {// Open the 404.html filestd::ifstream file_404(root_dir + "/404.html", std::ios::binary);if (!file_404) {response_stream << "HTTP/1.0 500 Internal Server Error\r\n";response_stream << "Connection: close\r\n\r\n";std::cout << "Response: 500 Internal Server Error" << std::endl;} else {response_stream << "HTTP/1.0 404 Not Found\r\n";response_stream << "Content-Type: text/html\r\n";response_stream << "Connection: close\r\n\r\n";response_stream << file_404.rdbuf();std::cout << "Response: 404 Not Found" << std::endl;}} else {response_stream << "HTTP/1.0 200 OK\r\n";response_stream << "Content-Type: " << get_content_type(full_path) << "\r\n";response_stream << "Connection: close\r\n\r\n";response_stream << file.rdbuf();std::cout << "Response: 200 OK, Content-Type: " << get_content_type(full_path) << std::endl;}boost::asio::write(socket, response);socket.shutdown(tcp::socket::shutdown_both);} catch (boost::system::system_error& e) {if (e.code() != boost::asio::error::eof) {throw; // Rethrow if it's not the expected exception.}// Handle EOF exception here if necessary.std::cout << "Connection closed by client." << std::endl;}
}

运行示例

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

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

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

相关代码

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

http://www.lryc.cn/news/335575.html

相关文章:

  • 蓝桥杯算法题:最大比例
  • 【堡垒机】堡垒机的介绍
  • 通过 ffmpeg命令行 调节视频播放速度
  • SQLite数据库在Linux系统上的使用
  • Spring中依赖注入的方法有几种,分别是什么?
  • 【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理
  • Acrel-1000DP光伏监控系统在尚雷仕(湖北)健康科技有限公司5.98MW分布式光伏10KV并网系统的应用
  • 电脑远程控制esp32上的LED
  • ARXML处理 - C#的解析代码(一)
  • OJ 栓奶牛【C】【Python】【二分算法】
  • Spring6-单元测试:JUnit
  • ubuntu系统安装k8s1.28精简步骤
  • 探讨Java和Go语言的缺点
  • 短剧在线搜索PHP网站源码
  • Python map遍历
  • 数据结构—红黑树
  • MES实施之工控机和电脑的选择
  • 京东云服务器4核8G主机租用价格418元一年,1899元3年
  • 【多模态融合】MetaBEV 解决传感器故障 3D检测、BEV分割任务
  • [通俗易懂]《动手学强化学习》学习笔记1-第1章 初探强化学习
  • centOS如何升级python
  • 【MYSQL锁】透彻地理解MYSQL锁
  • 【静态分析】静态分析笔记01 - Introduction
  • 使用的sql
  • 【ZZULIOJ】1052: 数列求和4(Java)
  • 【Linux】tcpdump P3 - 过滤和组织返回信息
  • vscode免费登录ssh ,linux git配置免密码
  • Netty 心跳(heartbeat)——服务源码剖析(上)(四十一)
  • C语言—每日选择题—Day65
  • 【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改