计算机网络第二章:作业 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地址和端口号正确配置。
相关推荐
麒麟而非淇淋12 分钟前
AJAX 入门 day1
前端·javascript·ajax
2401_8581205314 分钟前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
(⊙o⊙)~哦17 分钟前
linux 解压缩
linux·运维·服务器
阿树梢19 分钟前
【Vue】VueRouter路由
前端·javascript·vue.js
随笔写2 小时前
vue使用关于speak-tss插件的详细介绍
前端·javascript·vue.js
史努比.2 小时前
redis群集三种模式:主从复制、哨兵、集群
前端·bootstrap·html
快乐牌刀片882 小时前
web - JavaScript
开发语言·前端·javascript
miao_zz3 小时前
基于HTML5的下拉刷新效果
前端·html·html5
Zd083 小时前
14.其他流(下篇)
java·前端·数据库
友友马3 小时前
『 Linux 』HTTP(一)
linux·运维·服务器·网络·c++·tcp/ip·http