2014-01-24 68 views
1

我已成功地從瀏覽器訪問我的網絡服務器,在服務器上下載了一個文件,並使用chrome正確查看了它。但是,當服務器預留約。 20秒,它會崩潰與IndexError。Python web服務器 - 分割文件名時出現IndexError

from socket import * 
serverport = 972 
serverSocket = socket(AF_INET, SOCK_STREAM) 
serverSocket.bind(('', serverport)) 
serverSocket.listen(1) 
print 'Standing by...' 

while True: 
    #Establish the connection 
    connectionSocket, addr = serverSocket.accept() 

    try: 
     message = connectionSocket.recv(1024) 
     filename = message.split()[1] 
     f = open(filename[1:]) 
     outputdata = f.read() 

     for i in range(0, len(outputdata)): 
      connectionSocket.send(outputdata[i]) 
     print 'Success! File sent!' 
     connectionSocket.close() 

    except IOError: 
     errormessage = 'Error 404 - File not found' 
     connectionSocket.send(errormessage) 

輸出我得到的是以下幾點:

Standing by.. 
Success! File sent! #sent everytime i request the webpage on the client localhost:80/helloworld.html 
Traceback (most recent call last): 
    File "C:/Users/Nikolai/Dropbox/NTNU/KTN/WebServer/TCPServer.py", line 14, in <module> 
    filename = message.split()[1] 
IndexError: list index out of range 
+0

嘗試'message = connectionSocket.recv(1024)[2:]' –

+0

當你添加它時,你的'logging.debug(message)'語句在錯誤行之前輸出了什麼? – geoffspear

+0

我不知道爲什麼有人低調。他在SO的第一個問題,這是很好的陳述。 –

回答

1

這可能是客戶端關閉連接。連接完成後,會收到一個空字符串''

''.split()[1]將失敗index out of range。我的建議是嘗試與該修補程序:

message = connectionSocket.recv(1024) 
if not message: 
    # do something like return o continue 

順便說一句,你應該recv從您的插座,直到你得到一個空字符串。在您的代碼中,如果請求大於1024,會發生什麼情況?像這樣的事情可以做:

try: 
    message = '' 
    rec = connectionSocket.recv(1024) 
    while rec: 
     rec = connectionSocket.recv(1024) 
     message += rec 
    if not message: 
     connectionSocket.close()    
     continue 
    filename = message.split()[1] 
    f = open(filename[1:]) 
    outputdata = f.read() 

    for i in range(0, len(outputdata)): 
     connectionSocket.send(outputdata[i]) 
    print 'Success! File sent!' 
    connectionSocket.close() 

你應該閱讀Socket Programming HOWTO,創建多線程服務器,這可能是你想怎麼辦你的:)

希望這有助於特意一部分!

+0

非常多的情況下,當我打印出連接時,會從客戶端發送一條空消息。我想這與客戶端配置有所不同。非常感謝您指出。 –

+0

@NikolaiHegelstad我將鏈接添加到文檔的相關部分。非常推薦閱讀。 –

+0

我會盡力實現這一點,我必須閱讀更多關於http請求緩衝區大小的內容。 –