對於System.Net.WebRequest和System.Net.HttpRequest而言,在兼容多線程和套接字使用方面遇到了麻煩。我試圖走低一級,滾動我自己的污垢簡單的Http類。如何重新使用TCP客戶端?
由於之前的問題是每個線程太快創建太多的套接字,我試圖在多次迭代(for循環)上使用一個套接字(每個線程1個)。
代碼:
我的測試類(已硬編碼IP和端口,直到我能得到它的工作):
public sealed class Foo : IDisposable {
private string m_ip = "localhost";
private int m_port = 52395;
private TcpClient m_tcpClient;
public Foo() {
m_tcpClient = new TcpClient(m_ip, m_port);
}
public void Execute() {
using(var stream = m_tcpClient.GetStream())
using(var writer = new StreamWriter(stream))
using(var reader = new StreamReader(stream)) {
writer.AutoFlush = true;
// Send request headers
writer.WriteLine("GET /File HTTP/1.1");
writer.WriteLine("Host: " + m_ip + ":" + m_port.ToString());
writer.WriteLine("Connection: Keep-Alive");
writer.WriteLine();
writer.WriteLine();
// Read the response from server
string response = reader.ReadToEnd();
Console.WriteLine(response);
}
}
void IDisposable.Dispose() {
m_tcpClient.Client.Dispose();
}
}
靜態無效的主要:
using(Foo foo = new Foo()) {
for(int i = 0; i < 10; i++) {
foo.Execute();
}
}
錯誤
在for循環的第一次迭代成功完成後,我收到的錯誤爲The operation is not allowed on non-connected sockets.
。
我瞭解錯誤的原因,(在響應被讀取後TcpClient.Client
關閉),但我不知道如何明確地告訴套接字保持打開狀態。
編輯 HTTP響應的進一步檢查我從它在它Connection: Close
回服務器。我假設,因爲這是原始的TCP它不會解析HTTP。這可能是問題的根源嗎? (如果是的話,有沒有辦法忽略它)
我讀的問題,他不_n想要創建多個實例。 – 2012-07-23 17:40:48
雖然這將在同步程序中起作用,但當我嘗試在多線程環境中使用它時,它不會幫助我使用套接字消耗。 (由操作系統清理的插槽與線程迭代不匹配,因此單個線程將創建多個插槽,從而快速佔用資源) – James 2012-07-23 17:41:45
如果您要這麼做,Dispose'應該可能調用Close。喜歡這個。儘管如此,我沒有看到一個令人信服的理由,不會將'close'重命名爲'Dispose'。對稱與'打開',也許...但是'關閉'實際上只是處理,所以... – cHao 2012-07-23 17:49:40