Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-我需要向一个http请求发送多个socket.send()_Python_Sockets_Http_Httpresponse_Httpserver - Fatal编程技术网

python-我需要向一个http请求发送多个socket.send()

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

我需要为我的“计算机网络”类创建一个基本http服务器。 在我的项目中,客户端要求服务器(通过GET请求)发送一个文件。 服务器需要使用HTTP响应进行响应,该响应包括有关文件的信息(例如文件大小、文件名),此外,服务器还应发送请求的文件。文件可以来自任何类型(例如二进制、文本)。 据我所知,客户端在每个请求上只能得到一个服务器的响应 未收到实际文件。 有什么想法吗

我的服务器代码:

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不是这样。我的理由是我通常不会在这么低的水平上处理这些东西。但几分钟后我确实记住了正确的信息。:)如果你喜欢我的答案,请随意回答。:)