实验描述:

本编程作业的题目描述

在这个编程作业中,你将用Python语言开发一个简单的Web服务器,它仅能处理一个请求。具体而言,你的Web服务器将:

  • 当一个客户(浏览器)联系时创建一个连接套接字;
  • 从这个连接套接字接收HTTP请求;
  • 解释该请求以确定所请求的特定文件;
  • 从服务器的文件系统获得请求的文件;
  • 创建一个由请求的文件组成的HTTP响应报文,报文前面有首部行;
    经TCP连接向请求浏览器发送响应。如果浏览器请求一个在该服务器种不存在的文件,服务器应当返回一个“404 Not Found”差错报文。
    在配套网站中,我们提供了用于该服务器的框架代码,我们提供了用于该服务器的框架代码。你的任务是完善该代码,运行服务器,通过在不同主机上运行的浏览器发送请求来测试该服务器。如果运行你服务器的主机上已经有一个Web服务器在运行,你应当为该服务器使用一个不同于80端口的其他端口。

Python编写的简单Web服务器的框架代码:

```python
#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()

代码的完善(中文注释自己写的):

WebServer.py

```python
#import socket module
from socket import * # 导入python套接字编程的库
serverSocket = socket(AF_INET, SOCK_STREAM) # new一个TCP欢迎套接字
#Prepare a sever socket 
serverSocket.bind(('',1234)) # 将TCP欢迎套接字绑定到指定端口1234
serverSocket.listen(1) # 设置服务器最大连接客户机数目为1

# 主体程序:服务器和客户机进行信息的交互
while True:     
	#Establish the connection    
	print ('Ready to serve...')     
	connectionSocket, addr =  serverSocket.accept(); # 建立一个TCP连接套接字,等待与客户端联系
	try:         
		message = connectionSocket.recv(1024); # 当建立了联系(accept()后),获取客户发送的报文
		filename = message.split()[1]                          
		f = open(filename[1:])
		outputdata = f.read(); # 从报文中读取信息
		#Send one HTTP header line into socket         
		header = ' HTTP/1.1 200 OK\nConnection: close\nConnent-Type: text/html\nConnent-Length: %d\n\n' % (len(outputdata))
		connectionSocket.send(header.encode())
				
		#Send the content of the requested file to the client(将 Web服务器请求到的网页 返还给客户机)
		for i in range(0, len(outputdata)):
			connectionSocket.send(outputdata[i].encode())
			
		connectionSocket.close()# 关闭TCP连接套接字
		
	except IOError:
		#Send response message for file not found(如果连接建立失败:请求的文件找不到,则返回错误信息)
		header = ' HTTP/1.1 404 Not Found'
		connectionSocket.send(header.encode())
         
		connectionSocket.close()# 关闭TCP连接套接字
		
serverSocket.close()# 关闭TCP欢迎套接字

客户机要请求的网页(和WebServer.py位于同一目录)
HelloWorld.html

<head>Hello World!</head>

运行效果:

服务器端运行py代码(请确保已经配置好了python3环境):
在这里插入图片描述
可以看到Ready to serve...表示服务器正在等待客户机请求(用于建立TCP连接套接字)。

客户端(浏览器)
在地址栏输入:本地IP地址/localhost:py代码中设置的服务器端口号/要访问的.html文件
如下访问http://localhost:1234/HelloWorld.html即可出现正常访问的界面:
在这里插入图片描述
如果客户机请求一个不存在的网页,则会出现404 Not Found
地址栏里输入:http://localhost:1234/123.html
在这里插入图片描述


可选练习:

  1. 目前,这个Web服务器一次只处理一个HTTP请求。请实现一个能够同时处理多个请求的多线程服务器。使用线程,首先创建一个主线程,在固定端口监听客户端请求。当从客户端收到TCP连接请求时,它将通过另一个端口建立TCP连接,并在另外的单独线程中为客户端请求提供服务。这样在每个请求/响应对的独立线程中将有一个独立的TCP连接。
  1. 不使用浏览器,编写自己的HTTP客户端来测试你的服务器。您的客户端将使用一个TCP连接用于连接到服务器,向服务器发送HTTP请求,并将服务器响应显示出来。您可以假定发送的HTTP请求将使用GET方法。
    客户端应使用命令行参数指定服务器IP地址或主机名,服务器正在监听的端口,以及被请求对象在服务器上的路径。以下是运行客户端的输入命令格式。 client.py server_host server_port filename

参考资料:

https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐