2015-01-24 5 views
1

"컴퓨터 네트워크"클래스에 대한 기본 http 서버를 만들어야합니다. 내 프로젝트에서 클라이언트는 GET 요청을 통해 서버에 파일을 보내도록 요청합니다. 서버는 파일에 대한 정보 (예 : 파일 크기, 파일 이름)를 포함하는 HTTP 응답으로 응답해야하며 요청 된 파일도 보내야합니다. 파일 형식 (예 : 바이너리, 텍스트) 일 수 있습니다. 내 이해에서 클라이언트가 모든 요청에 ​​단 하나의 서버의 응답을 얻을 수 있습니다. 내 경우에는 파일 데이터와 HTTP 응답을받은 후 실제 파일을받지 않습니다. 아이디어가 있으십니까?python - 하나의 http 요청에만 socket.send()를 더 보내야합니다.

내 서버의 코드 :

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() 
+0

높은 수준에서 볼 때 클라이언트에서 2 개의 요청을 사용하는 방법 (이름이 충분하지 않고 두 번째로 실제 데이터를 가져 오는 경우 메타 데이터, 이름, 크기 및 ID를 먼저 얻음) 또는 메타 데이터와 데이터 (XML, json 또는 bson 형식을 생각하는)를 모두 포함하는 stuctured 응답을 사용하십시오. –

답변

3

을 보낼하고자하는 메타 데이터는 아마도 header response fields에 보낼 수 있습니다. 파일 크기 자체는 Content-Length (예제 코드에서 이미 전송 중)이고 파일 형식은 Content-Type에 MIME 형식으로 지정해야하며 권장 파일 이름은 Content-Disposition이 될 수 있습니다.

각 헤더 행은 CR-LF 쌍 (예 : \r\n)으로 끝나야하며 실제 헤더 앞에 최종 헤더 행 뒤에 빈 줄이 와야한다는 점을 언급해야합니다. 즉, 마지막 헤더 행 다음에 추가 CR-LF 쌍이 와야합니다. 위키 List of HTTP header fields 가입일

:

필드는 메시지의 첫 번째 라인 인 요청 또는 응답 라인, 이후 송신되는 헤더. 헤더 필드는 캐리지 리턴 (CR) 및 줄 바꿈 (LF) 문자 시퀀스로 끝나는 일반 텍스트 문자열 형식의 콜론으로 구분 된 이름 - 값 쌍입니다. 헤더 섹션의 끝은 2 개의 연속적인 CR-LF 쌍의 전송을 가져 오는 빈 필드로 표시됩니다.

+0

안녕하세요 PM 2Ring, 빠른 답장을 보내 주셔서 감사합니다. 실제로 "clientSocket.send (fileToSend)"를 사용하여 파일을 보내려면 파일과 메타 데이터 모두에 대한 응답을 사용하려면 두 응답을 모두 포함해야합니다. 답변을 올바르게 이해했다면 응답은 해당 필드의 모든 메타 데이터와 함께 HTTP 응답이어야합니다. HTTP 응답을 사용하여 메타 데이터와 실제 파일을 모두 포함 할 수 있습니까? 어떻게 보여줄 수 있니? 감사합니다. Alon –

+0

'HEAD'요청과 'GET'요청에 응답 할 수 있다면 프로그램을보다 유연하게 만들 수 있습니다. 'HEAD' 요청으로 마치'GET'에 응답하는 것처럼 파일 데이터를 실제로 추가하지 않고 모든 헤더 데이터를 보내면됩니다.; 사용 도구는'HEAD' 요청을 사용하여'GET' 요청을하기 전에 자원을 가져오고 싶은지를 결정할 수 있습니다. –

+0

감사합니다 !! 이제 –