实现一个轻量级的 Web 服务器

实现一个轻量级的 Web 服务器 实验目的 深入掌握 HTTP 协议规范,学习如何编写标准的互联网应用服务器, 实验内容 服务程序能够正确解析 HTTP 协议

本文包含相关资料包-----> 点击直达获取<-------

实现一个轻量级的 Web 服务器

实验目的

深入掌握 HTTP 协议规范,学习如何编写标准的互联网应用服务器。

实验内容

服务程序能够正确解析 HTTP 协议,并传回所需的网页文件和图片文件

使用标准的浏览器,如 IE、Chrome 或者 Safari,输入服务程序的 URL 后,能够正常显示服务器上的网页文件和图片

服务端程序界面不做要求,使用命令行或最简单的窗体即可

功能要求如下:

  • 服务程序运行后监听在 80 端口或者指定端口
  • 接受浏览器的 TCP 连接(支持多个浏览器同时连接)
  • 读取浏览器发送的数据,解析 HTTP 请求头部,找到感兴趣的部分
  • 根据 HTTP 头部请求的文件路径,打开并读取服务器磁盘上的文件,以 HTTP 响应格式传回浏览器。要求按照文本、图片文件传送不同的 Content-Type,以便让浏览器能够正常显示。

  • 分别使用单个纯文本、只包含文字的 HTML 文件、包含文字和图片的 HTML 文件进行测试,浏览器均能正常显示。

本实验可以在前一个 Socket 编程实验的基础上继续,也可以使用第三方封装好的

TCP 类进行/网络数据的收发

本实验要求不使用任何封装 HTTP 接口的类库或组件,也不使用任何服务端脚本程

序如 JSP、ASPX、PHP 等

本实验可单独完成或组成两人小组。若组成小组,则一人负责编写服务器 GET 方法的响应,另一人负责编写 POST 方法的响应和服务器主线程。

主要仪器设备

联网的 PC 机、Wireshark 软件、Visual Studio、gcc 或 Java 集成开发环境。

操作方法与实验步骤

阅读 HTTP 协议相关标准文档,详细了解 HTTP 协议标准的细节,有必要的话使用

Wireshark 抓包,研究浏览器和 Web 服务器之间的交互过程

创建一个文档目录,与服务器程序运行路径分开

准备一个纯文本文件,命名为 test.txt,存放在 txt 子目录下面准备好一个图片文件,命名为 logo.jpg,放在 img 子目录下面

写一个 HTML 文件,命名为 test.html,放在 HTML 子目录下面,主要内容为:

```

Test

This is a test

Login: Pass:

```

将 test.html 复制为 noimg.html,并删除其中包含 img 的这一行。

服务端编写步骤(需要采用多线程模式)

运行初始化,打开 Socket,监听在指定端口(请使用学号的后 4 位作为服务器的监听端口)

主线程是一个循环,主要做的工作是等待客户端连接,如果有客户端连接成功,为该客户端创建处理子线程。该子线程的主要处理步骤是:

不断读取客户端发送过来的字节,并检查其中是否连续出现了 2 个回车换行符,如果未出现,继续接收;如果出现,按照 HTTP 格式解析第 1 行,分离出方法、文件和路径名,其他头部字段根据需要读取。

如果解析出来的方法是 GET

根据解析出来的文件和路径名,读取响应的磁盘文件(该路径和服务器程序可能不在同一个目录下,需要转换成绝对路径)。如果文件不存在,第 3 步的响应消息的状态设置为 404,并且跳过第 5 步。

准备好一个足够大的缓冲区,按照 HTTP 响应消息的格式先填入第 1 行(状态码=200),加上回车换行符。然后模仿 Wireshark 抓取的 HTTP 消息,填入必要的几行头部(需要哪些头部,请试验),其中不能缺少的 2 个头部是 Content-Type 和 Content-Length。Content-Type 的值要和文件类型相匹配(请通过抓包确定应该填什么),Content-Length 的值填写文件的字节大小。

在头部行填完后,再填入 2 个回车换行

将文件内容按顺序填入到缓冲区后面部分。

如果解析出来的方法是 POST

检查解析出来的文件和路径名,如果不是 dopost,则设置响应消息的状态为 404,然后跳到第 9 步。如果是 dopost,则设置响应消息的状态为 200,并继续下一步。

读取 2 个回车换行后面的体部内容(长度根据头部的 Content-Length 字段的指示),并提取出登录名(login)和密码(pass)的值。如果登录名是你的学号,密码是学号的后 4 位,则将响应消息设置为登录成功,否则将响应消息设置为登录失败。

将响应消息封装成 HTML 格式,如

```

响应消息内容

```

准备好一个足够大的缓冲区,按照 HTTP 响应消息的格式先填入第 1 行(根据前面的情况设置好状态码),加上回车换行符。然后填入必要的几行头部,其中不能缺少的 2 个头部是 Content-Type 和Content-Length。Content-Type 的值设置为 text/html,如果状态码=200,则 Content-Length 的值填写响应消息的字节大小,并将响应消息填入缓冲区的后面部分,否则填写为 0。

最后一次性将缓冲区内的字节发送给客户端。

发送完毕后,关闭 socket,退出子线程。

主线程还负责检测退出指令(如用户按退出键或者收到退出信号),检测到后即通知并等待各子线程退出。最后关闭 Socket,主程序退出。

编程结束后,将服务器部署在一台机器上(本机也可以)。在服务器上分别放置纯文本文件(.txt)、只包含文字的测试 HTML 文件(将测试 HTML 文件中的包含 img 那一行去掉)、包含文字和图片的测试 HTML 文件(以及图片文件)各一个。

确定好各个文件的 URL 地址,然后使用浏览器访问这些 URL 地址,如 http://x.x.x.x:port/dir/a.html,其中 port 是服务器的监听端口,dir 是提供给外部访问的路径,请设置为与文件实际存放路径不同,通过服务器内部映射转换。

检查浏览器是否正常显示页面,如果有问题,查找原因,并修改,直至满足要求使用多个浏览器同时访问这些 URL 地址,检查并发性

实验数据记录和处理

请将以下内容和本实验报告一起打包成一个压缩文件上传:

源代码:需要说明编译环境和编译方法,如果不能编译成功,将影响评分

可执行文件:可运行的.exe 文件或 Linux 可执行文件 服务器的主线程循环关键代码截图(解释总体处理逻辑,省略细节部分)

通过阻塞调用 accept 进行监听客户端的消息,确认连接后开启子线程,接收客户端发送的消息并对其进行处理。

服务器的客户端处理子线程关键代码截图(解释总体处理逻辑,省略细节部分)

通过解析客户端发来的信息,确定请求类型是 GET 还是 POST,根据请求类型来处理信息。

服务器运行后,用 netstat –an 显示服务器的监听端口

浏览器访问纯文本文件(.txt)时,浏览器的 URL 地址和显示内容截图。

服务器上文件实际存放的路径:

服务器的相关代码片段:

浏览器访问只包含文本的 HTML 文件时,浏览器的 URL 地址和显示内容截图。

服务器文件实际存放的路径:

Wireshark 抓取的数据包截图(只截取 HTTP 协议部分,包括 HTML 内容):

浏览器访问包含文本、图片的 HTML 文件时,浏览器的 URL 地址和显示内容截图。

服务器上文件实际存放的路径:

Wireshark 抓取的数据包截图(只截取 HTTP 协议部分,包括 HTML、图片文件的部分内容):

浏览器输入正确的登录名或密码,点击登录按钮(login)后的显示截图。

服务器相关处理代码片段:

Wireshark 抓取的数据包截图(HTTP 协议部分)

浏览器输入错误的登录名或密码,点击登录按钮(login)后的显示截图。

Wireshark 抓取的数据包截图(HTTP 协议部分)

多个浏览器同时访问包含图片的 HTML 文件时,浏览器的显示内容截图(将浏览器窗口缩小并列)

多个浏览器同时访问包含图片的 HTML 文件时,使用 netstat –an 显示服务器的 TCP 连接(截取与服务器监听端口相关的)

实验结果与分析 HTTP 协议是怎样对头部和体部进行分隔的? Ans:通过空行来分割

浏览器是根据文件的扩展名还是根据头部的哪个字段判断文件类型的?

Ans:通过头部的 Content-Type 字段

HTTP 协议的头部是不是一定是文本格式?体部呢? Ans:头部是文本格式,体部可以是文本,也可以是音频、图片数据传输的字节流形式.

POST 方法传递的数据是放在头部还是体部?两个字段是用什么符号连接起来的? Ans:放在体部,通过“&”符号连接

讨论、心得

Static wrapper library (for winsock), undefined reference to XXX:在使用 g++ 编译的时候需要加上-lwsock32

本次实验主要实现了简易的 Web 服务器,对网络编程有了更加深入的掌握,并熟悉了 HTTP 协议的内容。通过这门课程实验的开展,我对于计算机网络各层的原理和应用有了更加清晰、直观的认识,感到收获很大。

参考文献

  • 基于openstack的私有云管理平台的设计与实现(南京理工大学·董利娟)
  • 基于JSF的Web-GIS研究与应用(武汉理工大学·周鼎)
  • 基于SSH框架的Web网站设计与实现(长春理工大学·冯学军)
  • 基于.NET框架的企业应用集成研究和实现(浙江大学·蒋元星)
  • 基于.NET下Web服务的信息查询系统的研究与设计(合肥工业大学·张静)
  • 基于J2EE的川渝中烟工业公司销售管理系统的设计与实现(电子科技大学·唐愚泰)
  • 基于SaaS的微服务重构机制的设计与实现(北京邮电大学·陈幸怡)
  • 轻量级J2EE开发的研究与应用(大连海事大学·李立华)
  • 基于SSH框架的Web网站设计与实现(长春理工大学·冯学军)
  • 轻量级J2EE开发的研究与应用(大连海事大学·李立华)
  • 基于JSF的Web-GIS研究与应用(武汉理工大学·周鼎)
  • 中小型项目的B/S架构开发方法研究(成都理工大学·周宁)
  • 轻量级J2EE开发的研究与应用(大连海事大学·李立华)
  • 基于.NET的Web Service技术应用(华中师范大学·赵生翼)
  • 轻量级J2EE开发的研究与应用(大连海事大学·李立华)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕业设计货栈 ,原文地址:https://m.bishedaima.com/yuanma/36166.html

相关推荐

  • 最小生成树之Python

    最小生成树 一,【实验名称】 最小生成树(可视化实现) 二,【实验原理】 程序基于 Python 实现其中利用了 Tkinter 库作为可视化界面的制作
    2024年05月14日
    1 1 1
  • 基于Java+JSP+Servlet的图书管理系统

    这是一个🔥🔥基于JSP+Servlet的图书管理系统🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 图书管理系统开发技术栈为JSP项目,可以作为毕业设计课程设计作业基于Java+Jsp+Servlet的编写一个图书管理系统
    2024年05月23日
    5 1 1
  • 使用 python 进行音频处理

    使用 python 进行音频处理 实验目的及实验内容 (本次实验所涉及并要求掌握的知识;实验内容;必要的原理分析) 实验目的: 使用 python 进行音频处理 实验内容: 学习音频相关知识点
    2024年05月14日
    2 1 1
  • 电影数据分析之Python

    电影数据分析 一,,实验概述 1,1 实验标 本项目希望基于电影数据集,依据电影的简介,关键词,预算,票房,用户评分等特征来对电影进行分析,并完成以下任务: 对电影特征的可视化分析对电影票房的预测 多功能个性化的电影推荐算法 1
    2024年05月14日
    3 1 1
  • 基于Python实现一个PoW的仿真程序

    1,作业内容 利用 Python 实现一个 PoW 的仿真程序,模拟一定数量的节点生成区块链的状态, 设置参数包括:节点数量和每个轮次出块的成功率
    2024年05月14日
    13 1 2
  • 基于Python实现个人微信的功能集成

    personal-wechatplus 个人微信的功能集成(获取热点新闻,自动回复,爬虫控制,傲梦编程教师端数据的自动抓取和检索) 代码框架 start
    2024年05月14日
    1 1 1
  • 基于Python实现英文单词学习系统

    1, 课程设计目的 《软件设计基础-Python》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖Python的知识点,又接近工程实际需要
    2024年05月14日
    2 1 1
  • 植物大战僵尸之Python

    植物大战僵尸 项目主要内容与目标 模仿设计并实现基于面向对象思想的一个简单版控制台植物大战僵尸, 植物设计包含向日葵, 普通豌豆射手, 双发豌豆射手, 寒冰豌豆射手
    2024年05月14日
    1 1 1
  • 基于Python实现类高级语言的词法分析器

    1, 需求分析 要求:阐述词法分析系统所要完成的功能 设计实现类高级语言的词法分析器,基本功能如下: 能识别以下几类单词: 标识符(由大小写字母
    2024年05月14日
    2 1 2
  • 基于JSP+Boostrap+JavaServlet+MySQL实现的企业OA系统

    基于JSP+Boostrap+JavaServlet+MySQL实现的企业OA系统 1,项目介绍 LeyeOA是一个OA办公自动化系统,基于Java开发的项目
    2024年05月14日
    13 1 2

发表回复

登录后才能评论