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

计算机网络第二章:作业 1: Web 服务器

文档:Web服务器的实现和测试

一、问题描述

本次实验要求开发一个简单的基于Python的Web服务器,服务器能够处理HTTP请求并返回HTML文件的内容。具体来说,Web服务器需要执行以下操作:

  1. 接收并解析HTTP请求:Web服务器从客户端接收HTTP请求,并解析所请求的文件。
  2. 从文件系统中读取文件:根据客户端请求,服务器从文件系统中获取相应的文件内容。
  3. 发送HTTP响应:服务器将文件内容封装到HTTP响应中并返回给客户端。
  4. 错误处理:如果请求的文件不存在,服务器返回一个“404 Not Found”错误页面。
  5. 测试服务器:使用浏览器访问服务器,验证HTML文件内容的返回及404错误处理。

二、问题解决方案

1. 开发环境
  • 编程语言:Python
  • 使用的库socket 模块用于TCP连接和套接字编程。
2. 设计思路
  1. 创建服务器套接字:在特定的IP地址和端口上监听客户端的TCP连接请求。
  2. 解析HTTP请求:当接收到来自客户端的请求时,解析请求报文中的文件名。
  3. 文件读取与响应构建:读取服务器上的HTML文件,并返回HTTP 200响应。如果文件不存在,返回404错误页面。
  4. 关闭连接:每次处理完请求后,关闭与客户端的连接。
3. 代码实现
from socket import *# 创建服务器套接字
serverSocket = socket(AF_INET, SOCK_STREAM)# 准备服务器,绑定端口 6789 并开始监听连接
serverSocket.bind(('', 6789))
serverSocket.listen(1)
print('Server is ready to receive...')while True:# 接受来自客户端的连接connectionSocket, addr = serverSocket.accept()print(f'Connection established with {addr}')try:# 从客户端接收HTTP请求message = connectionSocket.recv(1024).decode()# 提取请求的文件名filename = message.split()[1]  # 获取请求的文件路径print(f'Requested file: {filename}')# 打开并读取该文件内容with open(filename[1:], 'r') as f:outputdata = f.read()# 发送HTTP响应头connectionSocket.send("HTTP/1.1 200 OK\r\n\r\n".encode())# 发送文件内容作为响应体for i in range(0, len(outputdata)):connectionSocket.send(outputdata[i].encode())# 关闭连接connectionSocket.close()except IOError:# 如果文件不存在,返回404错误error_message = "<html><body><h1>404 Not Found</h1></body></html>"connectionSocket.send("HTTP/1.1 404 Not Found\r\n\r\n".encode())connectionSocket.send(error_message.encode())# 关闭连接connectionSocket.close()# 关闭服务器(实际上,这在代码中永远不会到达)
serverSocket.close()
4. 代码说明
  1. 导入socket模块:使用from socket import *导入所需的套接字模块。
  2. 创建服务器套接字:调用socket()函数创建TCP套接字,使用bind()将服务器绑定到指定的端口号,使用listen()函数使服务器准备好接受连接。
  3. 处理客户端请求:使用accept()函数接受客户端的连接。recv()函数用于从客户端接收HTTP请求报文,并通过split()解析报文获取文件路径。
  4. 读取文件并响应:根据请求的文件路径打开文件,读取其内容,并使用send()将响应返回给客户端。如果请求的文件不存在,服务器返回404错误页面。
  5. 关闭连接:处理完成后,使用close()关闭与客户端的连接。
5. 错误处理

在代码中,使用try-except块来处理文件读取过程中的异常。文件不存在时,服务器会返回HTTP 404错误。

三、测试服务器

1. 准备工作
  • 在服务器所在的目录中创建一个HTML文件(如HelloWorld.html),其内容可以是简单的HTML代码,如:
<!DOCTYPE html>
<html>
<head><title>Hello World</title></head>
<body><h1>Hello, World!</h1></body>
</html>
  • 运行服务器程序:
python webserver.py
2. 测试步骤
  1. 获取服务器的IP地址
    使用ifconfig命令获取服务器的IP地址。比如在wlo1接口下,IP地址是172.20.10.2

  2. 在浏览器中访问服务器

    • 打开浏览器,输入http://172.20.10.2:6789/HelloWorld.html。如果服务器运行正常,浏览器将显示HelloWorld.html的内容,即“Hello, World!”。

    • 如果尝试访问一个不存在的文件,如http://172.20.10.2:6789/nonexistent.html,则服务器将返回404 Not Found错误页面。

3. 预期结果

四、总结

通过本次实验,我们实现了一个简单的Python Web服务器,并学会了如何使用套接字来处理HTTP请求。我们完成了以下任务:

  • 构建了Web服务器处理HTTP请求。
  • 实现了文件读取及HTTP响应功能。
  • 处理了404错误的情况。
  • 使用浏览器测试了服务器的功能,并成功获取文件内容以及处理不存在的文件。

五、注意事项

  • 确保防火墙没有阻止端口6789的外部访问。
  • 服务器和客户端应处于同一局域网中,或者服务器的IP地址是公开的。
  • 在不同的设备或不同的网络环境中,确保服务器IP地址和端口号正确配置。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 相机光学(三十七)——自动对焦原理
  • 2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序
  • OpenCV高阶操作
  • 耐压110V茂睿芯MK9019可以向下兼容MK9016
  • 找了一家征信公司,干了两个多月。。。
  • 【每日一诗】【诗词创作】【诗】《雨前秋夜》
  • mysql 修改索引
  • Spring Boot- 配置中心问题
  • 深度学习速通系列:TextCNN介绍
  • Ubuntu20.04点击文件闪退
  • 海康威视摄像机和录像机的监控与回放
  • 计算机毕业设计 家电销售展示平台的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 代码随想录算法训练营第13天|二叉树基础知识、递归遍历、迭代遍历、层序遍历、116. 填充每个节点的下一个右侧节点指针
  • CTFShow-反序列化
  • QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android开源项目规范总结
  • Angular2开发踩坑系列-生产环境编译
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 多线程编程之:notify 和 wait 用法
  • js作用域和this的理解
  • k8s 面向应用开发者的基础命令
  • Twitter赢在开放,三年创造奇迹
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue2.0 实现互斥
  • WePY 在小程序性能调优上做出的探究
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 深入 Nginx 之配置篇
  • 我看到的前端
  • 学习JavaScript数据结构与算法 — 树
  • 优秀架构师必须掌握的架构思维
  • PostgreSQL之连接数修改
  • ​Spring Boot 分片上传文件
  • #100天计划# 2013年9月29日
  • #define与typedef区别
  • #QT 笔记一
  • #数学建模# 线性规划问题的Matlab求解
  • (1) caustics\
  • (AngularJS)Angular 控制器之间通信初探
  • (ibm)Java 语言的 XPath API
  • (Java数据结构)ArrayList
  • (web自动化测试+python)1
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (四)鸿鹄云架构一服务注册中心
  • (一)SpringBoot3---尚硅谷总结
  • (正则)提取页面里的img标签
  • ****三次握手和四次挥手
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .cn根服务器被攻击之后
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 使用 XPath 来读写 XML 文件
  • .net开发时的诡异问题,button的onclick事件无效