本关任务:实现服务器向请求客户端返回响应头部信息的代码。
为了完成本关任务,你需要:
掌握 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()
下一篇:定长内存池的实现