2012-03-23 29 views
0

以下是在一個端口上偵聽HTTP請求並將請求包發送到端口80上運行的服務器的代碼,獲取響應併發送數據返回給客戶端。現在,一切都正在執行罰款,但下面的代碼行:sock.recv()在python代碼中執行時間太長

data = req_soc.recv(1024) 

正在採取太多的時間來執行,我已經觀察到,需要很長的時間,當它要收到/最後的分組執行。我也嘗試使用select.select()相同的代碼,但結果是相同的。由於我想處理來自客戶端和實際HTTP服務器的數據(原始數據),因此除了使用套接字之外別無選擇。

import socket 
import thread 

def handle_client(client): 
    data = client.recv(512) 
    request = '' 
    request += data 
    print data 

print '-'*20 
spl = data.split("\r\n") 

print spl[0] 
print spl[1] 

if len(request): 
    req_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    req_soc.connect(('localhost', 80)) 
    req_soc.send(request) 

    response = '' 
    data = req_soc.recv(1024) 
    while data: 
     response += data 
     print 1 
     data = req_soc.recv(1024) 
    req_soc.close() 
    print response 
    if len(response): 
     client.send(response) 
client.close() 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind(('localhost', 4422)) 
server.listen(5) 

print("Server is running...\n") 

MSGLEN = 1024 

while 1: 

    client, address = server.accept() 
    thread.start_new_thread(handle_client, (client,)) 

回答

0

客戶端可以在一個連接中執行多個命令(例如:GET)。您不能等待客戶端發送所有命令,因爲根據您返回的內容可能會請求更多(例如:網頁圖像)。您必須解析請求的部分(命令),找到邊界,將請求轉發給服務器並將答案寫回客戶端。所有這些都不妨礙閱讀客戶端。

我不確定在python中做什麼最好的方法是什麼,但是如果你花費5分鐘的谷歌搜索,你會發現一個完美的HTTP代理庫。

+0

其實這是我的項目,所以我不能使用任何庫。我將不得不使用套接字來做到這一點。另外,當我從客戶端收到請求時,我一次只收到一個HTTP GET請求。 – vedarthk 2012-03-23 15:26:37

+0

發送完整消息後,您的客戶端必須在套接字上執行write shutdown操作,否則您的recv將繼續阻塞...還請注意,我沒有說您應該使用庫,您可以檢查*來源* – 2012-03-23 15:47:15

+0

行。很抱歉對於這個誤會。 – vedarthk 2012-03-23 16:40:25