任务描述
本关任务:实现服务器向请求客户端返回响应头部信息的代码。
相关知识
为了完成本关任务,你需要:
掌握 WEB 服务器响应消息头部定义
掌握如何发送响应消息给相应客户端
WEB服务器响应消息头部定义
WEB 服务器在接收到客户端的连接请求后,接下来就会响应该请求。HTTP 响应报文由三部分组成:响应行、响应头、响应体。如下图所示。
响应行:一般由协议版本、状态码及其描述组成,比如 HTTP/1.1 200 OK其中协议版本 HTTP/1.1 或者 HTTP/1.0,200 就是它的状态码,OK 则为它的描述。
响应头:用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理它回送的数据。
常见的响应头字段含义:
Allow:服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding:文档的编码(Encode)方法。
Content-Length:表示内容长度。
Content-Type:表示后面的文档属于什么MIME类型。
Date:当前的GMT时间
Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。
Last-Modified:文档的最后改动时间。
Location:用于重定向接收者到一个新URI地址。
Refresh:告诉浏览器隔多久刷新一次,以秒计。
Server:服务器通过这个头告诉浏览器服务器的类型。
在这个 WEB 服务器返回的头部信息示例如下:
HTTP/1.1 200 OK
Connection: close
Content-Type: text/html
Content-Length: 24
发送响应消息头部内容
在定义好响应消息的头部信息后,使用套接字的 send 方法发送即可。
在发送前需要使用编码 encode() 方法,将字符串转换为字节数组后发送。
例如:
socket.send(header.encode())
编程要求
根据提示,在右侧编辑器代码中 Begin-End 之间补充代码,实现将响应消息头部发送给请求客户端的功能。
答案:
#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
#Prepare a sever socket
serverSocket.bind(("127.0.0.1",6789))
serverSocket.listen(1)
#while True:
print('开始WEB服务...')
try:
connectionSocket, addr = serverSocket.accept()
message = connectionSocket.recv(1024) # 获取客户发送的报文
#读取文件内容
filename = message.split()[1]
f = open(filename[1:])
outputdata = f.read();
#发送响应的头部信息
header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (len(outputdata))
#########Begin#########
connectionSocket.send(header.encode())
#########End#########
connectionSocket.close()
except IOError:
connectionSocket.close()
serverSocket.close()