《计算机网络—自顶向下方法》 第二章套接字编程:1.Web服务器
实验描述:本编程作业的题目描述:在这个编程作业中,你将用Python语言开发一个简单的Web服务器,它仅能处理一个请求。具体而言,你的Web服务器将:当一个客户(浏览器)联系时创建一个连接套接字;从这个连接套接字接收HTTP请求;解释该请求以确定所请求的特定文件;从服务器的文件系统获得请求的文件;创建一个由请求的文件组成的HTTP响应报文,报文前面有首部行;经TCP连接向请求...
·
实验描述:
本编程作业的题目描述:
在这个编程作业中,你将用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
可选练习:
- 目前,这个Web服务器一次只处理一个HTTP请求。请实现一个能够同时处理多个请求的多线程服务器。使用线程,首先创建一个主线程,在固定端口监听客户端请求。当从客户端收到TCP连接请求时,它将通过另一个端口建立TCP连接,并在另外的单独线程中为客户端请求提供服务。这样在每个请求/响应对的独立线程中将有一个独立的TCP连接。
- 不使用浏览器,编写自己的HTTP客户端来测试你的服务器。您的客户端将使用一个TCP连接用于连接到服务器,向服务器发送HTTP请求,并将服务器响应显示出来。您可以假定发送的HTTP请求将使用GET方法。
客户端应使用命令行参数指定服务器IP地址或主机名,服务器正在监听的端口,以及被请求对象在服务器上的路径。以下是运行客户端的输入命令格式。client.py server_host server_port filename
参考资料:
https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES
更多推荐



所有评论(0)