python-我需要向一个http请求发送多个socket.send()
我需要为我的“计算机网络”类创建一个基本http服务器。 在我的项目中,客户端要求服务器(通过GET请求)发送一个文件。 服务器需要使用HTTP响应进行响应,该响应包括有关文件的信息(例如文件大小、文件名),此外,服务器还应发送请求的文件。文件可以来自任何类型(例如二进制、文本)。 据我所知,客户端在每个请求上只能得到一个服务器的响应 未收到实际文件。 有什么想法吗 我的服务器代码:python-我需要向一个http请求发送多个socket.send(),python,sockets,http,httpresponse,httpserver,Python,Sockets,Http,Httpresponse,Httpserver,我需要为我的“计算机网络”类创建一个基本http服务器。 在我的项目中,客户端要求服务器(通过GET请求)发送一个文件。 服务器需要使用HTTP响应进行响应,该响应包括有关文件的信息(例如文件大小、文件名),此外,服务器还应发送请求的文件。文件可以来自任何类型(例如二进制、文本)。 据我所知,客户端在每个请求上只能得到一个服务器的响应 未收到实际文件。 有什么想法吗 我的服务器代码: import socket import os import sys root = "J:\\Computer
import socket
import os
import sys
root = "J:\\Computers network - Cyber\\HTTP-Server\\"
serverSocket=socket.socket()
serverSocket.bind(('0.0.0.0',8080))
serverSocket.listen(1)
(clientSocket, clientAddress)=serverSocket.accept()
clientRequest = clientSocket.recv(1024)
print clientRequest
requestSplit = clientRequest.split()
for i in xrange(2):
if requestSplit[0] == "GET":
response = "HTTP/1.1 200 OK\r\n"
if len(requestSplit[1]) > 1:
fileRequestList = requestSplit[1].split('/')
filePath = requestSplit[1].replace('/','\\')
print "Client asked for " + filePath
if os.path.isfile(root + filePath):
try:
# Writing the response
fileSize = os.path.getsize(root + filePath)
response += "content-Length: " + str(fileSize) + "\r\n"
print response
clientSocket.send(response)
# Finding and sending the file name and the actual file
print "File path " + filePath + " exists"
f = open(root + filePath,'rb')
fileToSend = f.read()
print "The file path: " + filePath + "\n"
clientSocket.send(root+filePath + "\n")
clientSocket.send(fileToSend)
except:
e = sys.exc_info()[0]
print "ERROR is ==> " + str(e) + "\n"
else:
print "File path " + filePath + " does not exist"
if i == 1:
#for loop runs 2 times and only the cliest socket closing.
clientSocket.close()
else:
# If the server did not got GET request the client socket closing.
clientSocket.close()
#fileToSend = ""
#filePath = ""
serverSocket.close()
您希望发送的元数据可能已发送进来。文件大小本身位于
内容长度
(您已经在示例代码中发送了该文件),文件类型应在内容类型
中指定为MIME类型,建议的文件名可以位于内容配置
中
我应该提到,每个标题行必须由CR-LF对终止,即,\r\n
,最后的标题行后面应该在实际数据之前有一个空行。换句话说,最后一个标题行后面应该有一个额外的CR-LF对
来自维基百科:
头字段在请求或响应行之后传输,请求或响应行是消息的第一行。标题字段是以明文字符串格式以冒号分隔的名称-值对,以回车符(CR)和换行符(LF)字符序列终止。报头部分的结尾由一个空字段表示,导致两个连续CR-LF对的传输
从高层次的角度来看,有两种方法可以做到这一点:要么使用来自客户机的两个请求(首先获取元数据、名称、大小和id,如果名称不够,第二个获取实际数据),要么使用一个包含元数据和数据的结构化答案(想想XML、json或bson格式)Hi PM 2Ring,谢谢您的快速回复。为了实际发送文件,我使用了“clientSocket.send(fileToSend)”,但是如果我想同时对文件和元数据使用响应,那么我需要一个响应来包含这两个。如果我正确理解了您的答案,那么响应应该是一个HTTP响应,其字段中包含所有元数据。我可以使用HTTP响应同时包含元数据和实际文件吗?你能告诉我怎么做吗?谢谢,如果您的程序能够响应
HEAD
请求以及GET
请求,那么您可以使程序更加灵活。对于HEAD
请求,您只需发送所有头数据即可响应,就好像您在响应GET
,但没有实际附加文件数据一样。;用户代理可以使用HEAD
请求来决定在发出GET
请求之前是否要获取资源。(以2为例)。您应该将所有标题信息和发送的文件数据组合成一个字符串,然后一次性发送。正如我上面提到的,确保在头信息和文件数据之间有一个空行。很抱歉之前的评论说你必须对非文本文件进行编码。有些协议是这样的,但HTTP不是这样。我的理由是我通常不会在这么低的水平上处理这些东西。但几分钟后我确实记住了正确的信息。:)如果你喜欢我的答案,请随意回答。:)