2014-01-16 30 views
0

我試圖通過單個套接字連接發送多個HTTP POST,但是一旦讀取輸入流,EPIPE就會中斷。單個套接字上的多個HTTP POST POST

mBufferedWriter.write("POST " + "/base/mypath" + " HTTP/1.1" + "\r\n"); 
mBufferedWriter.write("Host: " + mIp + "\r\n"); 
mBufferedWriter.write("Content-Length: " + json.toString().length()"\r\n"); 
mBufferedWriter.write("Content-Type: application/json\r\n"); 
mBufferedWriter.write("Connection: Keep-Alive\r\n\r\n"); 
mBufferedWriter.write(json.toString() + "\r\n"); 
mBufferedWriter.flush(); 

我的第一次POST會到達服務器。我正試圖實現流水線。還爲套接字設置保持活動狀態

+2

每個連接都不需要自己的套接字嗎? – bblincoe

+0

如果我使用單獨的套接字,我的帖子很榮幸。正如我必須發送數百個帖子需要重用連接。 –

+0

看看這個:http://kegel.com/c10k.html – bblincoe

回答

3

HTTP Pipelining涉及的不僅僅是重新使用現有連接(HTTP Keep-Alive)。流水線處理涉及同時在單個連接上運行多個HTTP請求,其中客戶端發送HTTP請求但不會在發送下一個HTTP請求之前等待其響應。客戶端和服務器都必須實現對流水線的支持纔能有效地使用它。即使那樣,也存在與流水線POST請求相關的問題,所以它們不應該被流水線化。在RFC 2616部分8.1.18.1.2.2中討論了HTTP Pipelining

如果您沒有真正實施管道傳輸,只保留活動,那麼您必須注意服務器的Connection響應標頭,因爲它會告訴您是否允許您通過同一連接發送新的HTTP請求。對於HTTP 1.1響應,如果服務器發送一個Connection: close頭,那麼套接字將在發送響應後由服務器關閉,因此您必須在發送下一個HTTP請求之前創建新連接。