计算机网络第二章:作业 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. 代码实现
python 复制代码
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代码,如:
html 复制代码
<!DOCTYPE html>
<html>
<head><title>Hello World</title></head>
<body><h1>Hello, World!</h1></body>
</html>
  • 运行服务器程序:
bash 复制代码
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地址和端口号正确配置。
相关推荐
道不尽世间的沧桑1 小时前
第17篇:网络请求与Axios集成
开发语言·前端·javascript
diemeng11192 小时前
AI前端开发技能变革时代:效率与创新的新范式
前端·人工智能
一天八小时2 小时前
计算机网络————(一)HTTP讲解
网络协议·计算机网络·http
bin91534 小时前
DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)
前端·javascript·vue.js·ecmascript·deepseek
勤奋的凯尔森同学4 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
丁卯4045 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo5 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
晴空万里藏片云5 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一5 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球5 小时前
el-button按钮的loading状态设置
前端·javascript