计算机网络——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.hqwc.cn/news/619961.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack打包ts代码

前面一篇文章介绍了如何使用ts‘编译器编译ts代码。但是在实际开发中很少直接使用ts编译器编译ts代码&#xff0c;而是配合打包工具来进行编译。本篇文章将介绍如何通过webpack对ts代码进行编译&#xff01; 生成package.json包 在新开的文件夹下运行以下命令 npm init -y安…

智慧医疗app

智慧医疗app是一套融合物联网、云计算和大数据等技术&#xff0c;以患者数据为中心的医疗服务模式&#xff0c;致力于为患者提供更加便捷、高效的医疗服务。 在线挂号、在线问诊、电子病历记录、健康管理以及药品购买等。患者可以通过app选择医生和挂号时间&#xff0c;并在线…

AI天使汇联合150家顶级基金、战投,征集优秀AI创业项目

鉴于AI天使汇主办的2024年3月期优秀项目征集活动效果超出预期&#xff0c;3月活动最后TOP20路演者中已有多家快速拿到了TS。 路演活动质量受到了AI创业公司和基金/战投伙伴的高度评价&#xff0c;现在开始四月期活动报名! 本期征集活动联合的顶级基金和战投数量增加到了150家…

数据可视化高级技术Echarts(桑基图入门)

目录 一、什么是桑基图 二、基本特征 三、设计注意事项 四、使用Echarts进行初级绘制 1.首先不能忘记五个基本步骤 2.绘制的时需要将图像类型series.type设定为sankey类型。 一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&…

【氮化镓】微波脉冲对GaN HEMT失效的影响

本文是一篇关于高功率微波脉冲作用下GaN HEMT&#xff08;高电子迁移率晶体管&#xff09;热电多物理场耦合失效的实验研究。文章由Xiangdong Li等人撰写&#xff0c;发表在2023年11月的《IEEE Transactions on Electron Devices》上。文章通过实验研究了在高功率微波脉冲应力下…

如何利用open3D来生成OCC

config.yaml depth: 10&#xff1a;#深度&#xff0c;设定为10&#xff0c;常用于决定处理或计算的层次或深入程度。 min_density: 0.1&#xff1a;#最小密度&#xff0c;设置为0.1&#xff0c;用于过滤或选择的密度阈值。 n_threads: -1&#xff1a;#线程数&#xff0c;设为-…

运行vue项目,控制台一直报错freeze ,删除node_modules缓存.cache,再npm 重启项目即可(2024-04-15)

控制台一直报错freeze Could not freeze ...: Cannot read property hash of undefined解决方案&#xff1a; 这个报错一般是由于npm运行缓存导致&#xff0c;清除即可&#xff1a; 删除 ./node_modules/.cache 再重新运行npm run start/dev/serve&#xff0c;即可重启项目…

Flink入门学习 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…

DrugBAN:基于双线性注意力网络进行药物-靶点结合预测。

DrugBan&#xff1a;一种可解释的双线性注意力网络进行药物-靶点结合预测。 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 DrugBan&#xff1a;一种可解释的双线性注意力网络进行药物-靶点结合预测。前言一、模型…

gcn代码处理出现的问题

README 版本不一致 python 2.7 PYTHON 3.7 切换 TensorFlow系统的学习使用 数据集下载

LoRa无线电机温振传感器,FlexLua低代码技术助力快速实现。

在物联网时代&#xff0c;无线传感技术的应用愈发广泛。其中&#xff0c;LoRa&#xff08;长距离低功耗无线技术&#xff09;作为一种适用于远距离、低功耗的通信技术&#xff0c;被广泛应用于各种物联网场景。而结合温度和振动传感技术&#xff0c;能够构建出用于监测机器状态…

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量…