2013-10-16 84 views
0

正如您所知道的,有時我們無法知道數據的大小(如果http響應頭中沒有Content-Length)。如何接收http響應數據使用套接字?

接收http響應數據(使用套接字)的最佳方式是什麼?

以下代碼可以獲取所有數據,但會阻止在buf = sock.recv(1024)

from socket import * 
import sys 

sock = socket(AF_INET, SOCK_STREAM) 
sock.connect(('www.google.com', 80)) 
index = "GET/HTTP/1.1\r\nHOST:www.google.com\r\nConnection:keep-alive\r\n\r\n" 
bdsock.send(index) 

data = "" 
while True: 
    buf = bdsock.recv(1024) 
    if not len(buf): 
     break 
    data += buf 
+0

如果您還在編寫發件人代碼,請使用標題系統。否則,你可以循環recv()直到它返回一個空字符串(可能是None,但是誰在乎他們都是Falsey)。 – ThinkChaos

回答

-1

第一使用大一號的,做了一些測試,然後看到的是這些緩衝區的lenght,您將有關於將最大尺寸是怎樣的想法。那麼只需使用該數字+100左右即可。 測試不同的場景將是您找到理想buf尺寸的最佳選擇。 這也有助於瞭解您使用套接字的協議,然後我們會爲您提供更好的想法和響應。

+0

這是http協議,我應該設置buf大小? –

1

我假設你也寫了發件人。

一個經典的方法是在通過線路發送的數據前加上數據長度。在接收端,您只是貪婪地追加接收到的所有數據到緩衝區,然後在每次接收到新數據時迭代緩衝區。

所以如果我發送100個字節的數據,我會在數據包的開頭加一個int 100前綴,然後發送。然後,接收者確切地知道它在找什麼。如果你想變得很花哨,你可以使用一個特殊的結束序列,如\x00\x01\x02來表示數據包的正確結束。這是一個容易實現的錯誤檢查形式。

+0

我不寫信發件人,我使用http協議。某些網站返回沒有「Content-Length」屬性,並且沒有特殊的結束順序。 –

0

今天我又得到了同樣的問題。 我發現簡單的方法是使用httplib

r = HTTPResponse(sock) 
r.begin() 
# now you can use HTTPResponse method to get what you want. 
print r.read() 
+0

其實這並不能回答這個問題。答案就是HTTPResponse所做的。 –

相關問題