2012-04-11 139 views
2

我想寫一個使用套接字庫的python web服務器。我已經通過了幾個來源,不知道爲什麼我寫的代碼不起作用。其他人已經運行了非常類似的代碼並聲稱它可行。我是python的新手,所以我可能會錯過簡單的東西。簡單的Python Web服務器故障

它現在可以工作的唯一方法是將數據變量發送回客戶端。瀏覽器打印原始的GET請求。當我嘗試發送HTTP響應時,連接超時。

import socket 

##Creates several variables, including the host name, the port to use 
##the size of a transmission, and how many requests can be handled at once 
host = '' 
port = 8080 
backlog = 5 
size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1: 
    client, address = s.accept() 
    data = client.recv(16) 
    if data: 
     client.send('HTTP/1.0 200 OK\r\n') 
     client.send("Content-Type: text/html\r\n\r\n") 
     client.send('<html><body><h1>Hello World</body></html>') 

    client.close() 
    s.close() 
+0

當你嘗試運行它時會發生什麼[除了這樣做是爲了學習套接字和/或HTTP,你在做什麼是一個壞主意] – 2012-04-11 18:33:15

+0

當我運行它時,shell彈出並等待,直到我鍵入localhost:8080進入瀏覽器。當我這樣做時,外殼關閉。過了一會兒,瀏覽器顯示連接超時。正如我前面提到的,如果我只向客戶端發送數據變量,則Web瀏覽器將顯示GET請求。 – egoskeptical 2012-04-11 18:43:49

回答

2

你需要響應之前消耗輸入,你不應該在你的while循環關閉套接字:

  1. 更換client.recv(16)client.recv(size),消耗請求。

  2. 將您的最後一行s.close()退回一個縮進,以便它不在您的while循環中。目前您正在關閉連接,然後再次嘗試從中重新登錄accept,這樣您的服務器將在第一次請求後崩潰。

除非您將此作爲練習,否則您應該擴展SimpleHTTPServer而不是直接使用套接字。

此外,在創建套接字(綁定之前)後添加此行可修復您可能獲得的任何「地址已被使用」錯誤。

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

祝你好運!

+0

謝謝你的迴應,格雷厄姆。我已經實現了更改(我最初有client.recv(大小),並更改它,因爲我正在排除故障)。但是,這兩個變化並沒有什麼不同。 – egoskeptical 2012-04-11 18:49:14

+0

哦。它適用於我的Linux和Chrome瀏覽器。試試'size = 4096'確保你消耗的一切。查看Chrome或Firefox的網絡檢查員,看看是否能提供任何線索。 – 2012-04-11 18:53:08

+0

這很奇怪。我在Windows 7上使用IE和FF。我試圖增加大小。我注意到唯一不同的是,當我在瀏覽器中輸入localhost:8080時,shell不會關閉。 Live HTTP Headers中沒有任何內容顯示。 – egoskeptical 2012-04-11 19:02:39