任务描述
本关任务:在WEB服务端程序中编写一段能将请求内容发送给相应客户端的代码。
相关知识
为了完成本关任务,你需要掌握:
如何获取发送内容的长度
如何发送数组元素内容。
获取数组的长度
前面获得请求文件内容存放在outputdata数组里面,利用 len()方法即可知道发送内容的长度。
发送数组内容
通过循环方式,将数组内容利用套接字的发送方法send()逐一发送即可。
示例如下:
for(int i = 0 ; i<output.length; i++){
mysocket.send(output[i].encode())
}
#或
for (i in range(0,len(output)))
mysocket.send(output[i].encode())
编程要求
根据提示,在右侧编辑器代码中 Begin-End 之间补充代码,实现将请求文件发送到相应客户端的功能。
测试说明
平台会对你编写的代码进行测试,并打印客户端接收到的文件内容:
预期输出:
开始WEB服务...
b'<head>hello world</head>'
答案:
#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))
connectionSocket.send(header.encode())
#发送文件内容
#########Begin#########
for i in outputdata:
connectionSocket.send(i.encode())
#########End#########
#关闭连接
connectionSocket.close()
except IOError: #异常处理
#发送文件未找到的消息
#关闭连接
connectionSocket.close()
#关闭套接字
serverSocket.close()