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

news/2024/9/19 7:28:07 标签: 计算机网络, 前端, 服务器

文档: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地址和端口号正确配置。

http://www.niftyadmin.cn/n/5665212.html

相关文章

XXl-SSO分布式单点登录框架

概述 下载地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso 文档地址&#xff1a;https://www.xuxueli.com/xxl-sso/ 概述 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持…

What is the new in C#11?

目录 Raw String Literals List Pattern Slice Pattern Var Pattern File Local Types Required Members Auto Default Structs Ref Fields Raw String Literals """里面的内容是space敏感的。 意思是如果”age”前面有几个空格&#xff0c;就会打印几个…

(PySpark)RDD实验实战——取一个数组的中间值

实验环境&#xff1a;提前准备好findspark&#xff0c;pyspark&#xff0c;py4j等库 import findspark from pyspark import SparkContext, SparkConffindspark.init() #初始化spark&#xff0c;默认为你所设定的环境变量conf SparkConf().setAppName("jsytest").…

Facebook运营:账号类型有哪些?有必要用静态住宅IP吗?

Facebook作为月活跃用户数高达几十亿的社交媒体平台&#xff0c;一直不断有新用户选择加入。从个人用户的生活分享到企业用户的商务宣传推广&#xff0c;Facebook提供各大功能和模块来满足用户需求。相应的&#xff0c;用户也需要了解平台特点来进行相应的操作。本文从账号类型…

五种数据库特性对比(Redis/Mysql/SQLite/ES/MongoDB)

做后端开发的程序员基本都要学会数据库的相关知识。 1、关系型数据 今天就着这段时间了解大模型的事需要牵扯到是我们接触最多的、也是入门后端必学的关系型数据库。在关系型数据库中&#xff0c;数据以表的形式进行组织和存储&#xff0c;每个表就像一个 Excel 表格&#xf…

Qt_多元素控件

目录 1、认识多元素控件 2、QListWidget 2.1 使用QListWidget 3、QTableWidget 3.1 使用QListWidget 4、QTreeWidget 4.1 使用QTreeWidget 5、QGroupBox 5.1 使用QGroupBox 6、QTabWidget 6.1 使用QTabWidget 结语 前言&#xff1a; 在Qt中&#xff0c;控件之间…

neo4j安装为服务+配置环境变量

目录 neo4j安装为服务 windows services 参照JDK&#xff0c;将neo4j加入到环境变量 neo4j安装为服务 windows services 我的上一篇文章详细写明了如何安装启动neo4j《neo4j安装启动教程对应的jdk配置》&#xff0c;文末的启动neo4j是通过cmd命令行访问bin目录&#xff0c;这…

【JavaEE】多线程编程引入——认识Thread类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 引入&#xff1a; 一&#xff1a;Thread类 1&#xff1a;Thread类可以直接调用 2&#xff1a;run方法 &a…