2016-11-14 85 views
-1

我已經開始學習使用python進行網絡編程,並且我的服務器出現了一些問題。python socket服務器使用http協議傳輸空文件

我試圖建立一個簡單的,可以用一些圖像,js和css代表簡單的服務器,但我無法弄清楚我的文件傳輸代碼有什麼問題,所以在我谷歌它超過小時我放棄了。 我通過瀏覽器檢查,它發送的HTML很好,但在頁面的上部有JS代碼。當我試圖單獨請求圖像時,瀏覽器下載了「name_I_choose.jpg」文件,但它是0kb文件。

這裏是我的代碼:

import socket 
import os 

print "server on" 
server_socket = socket.socket() 
server_socket.bind(("127.0.0.1", 80)) 
server_socket.listen(10) 
while True: 
    (client_socket, client_address) = server_socket.accept() 
    try: 
     data = client_socket.recv(1024) 
     # print data 
    except socket.error: 
     print "no more requests, bye" 
     break 
    if not data: 
     break 
    lines = data.split("\r\n") 
    print lines[0] 
    parts = lines[0].split(" ") 
    print "1: " + parts[0] + " 2: " + parts[1] + " 3: " + parts[2] 
    if parts[0] == "GET" and parts[2] == "HTTP/1.1": 
     print "good" 
     if parts[1] == "\\" or parts[1] == "/": 
      path = "path/to/root/index.html" 
     else: 
      path = "path/to/root" + parts[1].replace("\\", "/") 
     if os.path.isfile(path): 
      f = file(path, 'rb') 
      size = b = os.path.getsize(path) 
      print size 
      types = {"txt": "text/html; charset=utf-8", "html": "text/html; charset=utf-8", "jpg": "image/jpeg", 
        "js": "text/javascript; charset=utf-8", "css": "text/css"} 
      f_type = types.get(path.split(".")[1]) 
      data = f.read(size) 
      print "sending data" 
      client_socket.send("HTTP/1.0 200 " + str(size) + "\r\n" + "Content-Type: " + f_type) 
      client_socket.send(data) 
     else: 
      print "file not found" 
      print path 
      client_socket.send("HTTP/1.0 404 -1\r\n") 
    else: 
     print "not GET HTML FORM" 
    break 
print "done" 
client_socket.close() 
server_socket.close() 

可能有很多問題,所以我會感激你的一切都會建議。謝謝:)

+0

當你運行這段代碼時你可以包含一些輸出嗎?幫助。 –

+0

你能更具體嗎?什麼樣的輸出? –

+0

對不起 - 我的意思是從這個程序輸出。你運行這個程序作爲服務器,然後你試圖從中獲取文件,對吧?你從運行的服務器看到什麼輸出?我在你的代碼中看到打印語句 - 你能告訴我們輸出嗎?你如何從這個正在運行的服務器獲取數據? –

回答

0

因此,最後我解決它,結果是問題是與文件閱讀。 正確的操作是:

with open(path, 'rb') as infile: 
      d = infile.read(1024) 
      while d: 
       try: 
        client_socket.send(d) 
       except socket.error, msg: 
        print "socket error occurred: ", msg 
       d = infile.read(1024)