《计算机网络自顶向下方法》第二章套接字编程作业——Web服务器

目录

一、实验内容

二、代码模板

三、实验具体操作

四、实验测试


一、实验内容

    在本实验中,您将学习Python中TCP连接的套接字编程的基础知识:如何创建套接字,将其绑定到特定的地址和端口,以及发送和接收HTTP数据包。您还将学习一些HTTP首部格式的基础知识。

     您将开发一个处理一个HTTP请求的Web服务器。您的Web服务器应该接受并解析HTTP请求,然后从服务器的文件系统获取所请求的文件,创建一个由响应文件组成的HTTP响应消息,前面是首部行,然后将响应直接发送给客户端。如果请求的文件不存在于服务器中,则服务器应该向客户端发送“404 Not Found”差错报文。

 

代码
在文件下面你会找到Web服务器的代码框架。您需要填写这个代码。而且需要在标有#Fill in start 和 # Fill in end的地方填写代码。另外,每个地方都可能需要不止一行代码。

运行服务器
将HTML文件(例如HelloWorld.html)放在服务器所在的目录中。运行服务器程序。确认运行服务器的主机的IP地址(例如128.238.251.26)。从另一个主机,打开浏览器并提供相应的URL。例如: http://128.238.251.26:6789/HelloWorld.html

 

“HelloWorld.html”是您放在服务器目录中的文件。还要注意使用冒号后的端口号。您需要使用服务器代码中使用的端口号来替换此端口号。在上面的例子中,我们使用了端口号6789. 浏览器应该显示HelloWorld.html的内容。如果省略“:6789”,浏览器将使用默认端口80,只有当您的服务器正在端口80监听时,才会从服务器获取网页。

 

然后用客户端尝试获取服务器上不存在的文件。你应该会得到一个“404 Not Found”消息。

二、代码模板

#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM) 
#Prepare a sever socket 
#Fill in start 
#Fill in end 
while True:     
    #Establish the connection    
    print 'Ready to serve...'     
    connectionSocket, addr =   #Fill in start  #Fill in end
    try:         
        message =   #Fill in start  #Fill in end
        filename = message.split()[1]                          
        f = open(filename[1:])
        outputdata = #Fill in start  #Fill in end
        #Send one HTTP header line into socket         
        #Fill in start         
        #Fill in end    

        #Send the content of the requested file to the client
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i])
        connectionSocket.close()
    except IOError:
        #Send response message for file not found
        #Fill in start
        #Fill in end

        #Close client socket
        #Fill in start
        #Fill in end             
    serverSocket.close()

三、实验具体操作

首先,我们先要完成相应的代码内容,相关的代码注释已经给出。

from socket import *  # 导入python套接字编程的库

#这里创建了一个服务器套接字
# AF_INET 表示该套接字将使用 IPv4 地址族,而 SOCK_STREAM 表示该套接字将使用 TCP 传输协议。这个套接字用于在服务器端监听来自客户端的连接请求。
serverSocket = socket(AF_INET, SOCK_STREAM)

# 将TCP欢迎套接字绑定到指定端口8000
# serverSocket.bind(("", serverPort)) 表示将服务器端的socket对象 serverSocket 绑定到指定的IP地址和端口号上,
# 其中 "" 表示IP地址为空字符串,表示绑定到服务器所在计算机的所有网络接口上,而 serverPort 则表示要绑定的端口号。
serverSocket.bind(('', 8000))
serverSocket.listen(1)  # 设置服务器最大连接客户机数目为1

# 主体程序:服务器和客户机进行信息的交互
while True:

    print('Ready to serve...')

    # 这行代码是等待客户端连接并建立套接字连接,当有客户端请求连接时,该函数返回两个参数,
    # 第一个参数是一个新的套接字连接 connectionSocket,可以用于与客户端进行通信,第二个参数是客户端的地址信息 addr。
    connectionSocket, addr = serverSocket.accept()
    try:
        message = connectionSocket.recv(1024)  # 从客户端接收报文,表示每次最多接受1024个字符

        # 从HTTP请求报文中解析出请求的文件名
        # 假设请求报文的第二个单词是文件名,以空格为分隔符
        filename = message.split()[1]

        # 打开请求的文件,并读取文件内容
        # 这里假设请求的文件都在服务器程序的当前目录下
        f = open(filename[1:])

        outputdata = f.read()  # 从报文中读取信息

        header = ' HTTP/1.1 200 OK\nConnection: close\nConnent-Type: text/html\nConnent-Length: %d\n\n' % (len(outputdata))
        
        # header.encode()将Python字符串转换为字节串,以便可以将它发送到网络。send()函数通过套接字将字节串发送给客户端。
        connectionSocket.send(header.encode())

        # 将Web服务器请求到的网页 返还给客户机
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i].encode())

        connectionSocket.close()  # 关闭TCP连接套接字

    except IOError:
        # 如果连接建立失败:请求的文件找不到,则返回错误信息
        header = ' HTTP/1.1 404 Not Found'
        connectionSocket.send(header.encode())

        connectionSocket.close()  # 关闭TCP连接套接字

serverSocket.close()  # 关闭TCP欢迎套接字

 header = ' HTTP/1.1 200 OK\nConnection: close\nConnent-Type: text/html\nConnent-Length: %d\n\n' % (len(outputdata))这行代码定义了一个HTTP响应头,表示服务器成功响应了客户端请求,状态码为200,响应内容的类型为HTML格式。具体各个字段的含义如下:

 

- `HTTP/1.1 200 OK`:表示响应协议版本和状态码,这里状态码为200,表示请求成功。
- `Connection: close`:表示连接关闭,即在发送完响应后,服务器和客户端的连接会关闭。
- `Content-Type: text/html`:表示响应内容的类型为HTML格式。
- `Content-Length: %d`:表示响应内容的长度,这里使用了Python字符串格式化,将`outputdata`:的长度替换了字符串中的`%d`。
- `\n\n`:表示两个换行符,用于分隔HTTP响应头和响应内容。

 

这个HTTP响应头会随着响应内容一起发送给客户端,告诉客户端如何处理响应内容。

 

当你运行这段代码时,会出现 “Ready to serve...” 表示服务器在等待客户机请求传送报文,然后你需要在这段代码文件的相同目录下创建一个html文件,然后填写你想要在浏览器中显示的内容。

最后,你需要记住你绑定的端口号,在浏览器中输入网址:http://localhost:8000/HelloWorld.html

 注:如果你你一次打开这个网址的时候出现了html文件的代码,请刷新就好。如果你在运行python代码期间修改了html文件的内容,请先重启一遍python程序再刷新网址,才能看见修改后的内容,原因详见上面的代码注释。

`http://localhost:8000/text.html` 是一个URL,它包含了协议(http)主机名(localhost),端口号(8000)路径(/text.html)。这个URL的意思是请求本地主机上的Web服务器,获取名为`text.html`的文本文件。如果该服务器正在监听端口8000并能够找到该文件,那么它会返回一个包含该文件内容的HTTP响应。因此,你可以在浏览器的地址栏中输入这个URL,以获取该文件的内容。

 

`localhost`是一个主机名,指代的是本地主机(本机),它对应着一个特殊的IP地址127.0.0.1。这个IP地址也被称为环回地址,表示数据包回送到本机进行处理,而不会发送到网络上。因此,当你在浏览器中输入`http://localhost:8000/`时,它实际上是请求了本地主机上的Web服务器,并通过端口8000与该服务器建立连接。这个技巧在开发和测试网络应用程序时非常有用,因为它允许你在本地主机上模拟Web服务器和客户端的交互过程,而不需要连接到远程计算机。

四、实验测试

9126b4a77eed47ff9bff2bce6016015c.png

704856edf5174bc6a839d1ce1460ba93.png 

 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值