2009-12-01 56 views
2

我在使用.Net TcpClient/Sockets編寫HTTP客戶端。.Net C#TcpClient/Socket HTTP客戶端性能/效率

到目前爲止,客戶端通過遍歷NetworkStream響應(在向TcpClient寫入GET請求之後),解析報頭並檢索相關消息體字節/分塊字節來處理Content-Length和分塊響應。爲此,它使用NetworkStream ReadByte方法。

這一切工作正常,但性能是應用程序的一個關鍵考慮因素,所以我想盡可能快速和高效。

最初,這將涉及將ReadByte替換爲郵件正文(基於Content-Length)的Read或分塊郵件正文字節檢索到適當大小的緩衝區中,在所有其他區域中使用ReadByte(例如,讀取Headers,Chunk大小等等)。

我很想知道更好的/不同的方式來達到最佳性能的想法嗎?顯然,HTTP的主要問題是不知道響應流的長度,除非它在檢索時被解析。

有一個具體的原因,爲什麼我沒有使用更多的抽象類(例如HttpWebRequest)(我需要在套接字級更好的控制)。

非常感謝,

克里斯

+0

順便說一句我很好奇 - 你提到你需要對Socket/Connection進行細粒度的控制,這就是爲什麼你不使用HttpWebRequest。你能告訴我們那些原因嗎? – feroze 2009-12-02 01:58:06

+0

我想模擬一個數字(可以說200個)Web客戶端,並且要做到這一點我希望每個客戶端都作爲一個線程來管理自己的連接,在多個不同請求期間保持打開狀態,暫停等等。客戶端將達到相同的終點(與標準負載測試工具非常相似的功能)。 我不相信HttpWebRequest可以實現這一點,因爲連接是通過服務點來處理的,該服務點可以停止這種粒度控制級別? – Chris 2009-12-02 11:46:40

+0

對不起,我還應該說我需要捕獲的信息,如第一個字節的時間,重新連接數等... – Chris 2009-12-02 12:11:44

回答

1

我建議使用一個進程,一箇中等大小的緩衝區。重複填充緩衝區,直到響應流結束。當緩衝區已滿或流結束時,將緩衝區內容附加到字符串(或用於存儲消息的任何內容)。

如果您想在流的早期讀取重要的信息位,請閱讀足夠的流以查看該信息。 (換句話說,如果你不想要,你不需要在第一遍填充緩衝區。)

你還應該考慮使用事件系統來表示新數據的存在這樣你的過程的主要部分就不需要知道數據來自何處或你如何緩衝它。

編輯

在回答您的評論的問題,如果你有一個連接,你嘗試多個請求重用,你可以創建一個線程,一遍又一遍從中讀取。當它找到數據時,它會使用該事件將它推出以供程序的主要部分處理。我沒有一個方便的樣本,但你應該能夠找到幾個與谷歌或谷歌搜索幾個。

+0

謝謝約翰。然而,如果我使用緩衝區,我認爲我需要使用Read(),它會在超過流結束時阻塞。當最後一個字節被讀取以進一步解析響應等時,我需要立即移動? 此外,您是否有任何示例/鏈接到類似的基於事件的系統? 謝謝! – Chris 2009-12-01 18:35:36

+0

如果您發送「Connection:close」作爲請求的一部分,則可以防止阻止。 – 2009-12-01 19:01:26

+0

不幸的是重新使用連接/保持活着也很重要... – Chris 2009-12-01 19:28:36