我在使用System.Net.WebRequest和System.Net.HttpRequest时,遇到了多线程和套接字消耗兼容性的问题。我试图降低一级并编写自己的简单Http类。由于以前的问题是每个线程过快地创建太多套接字,所以我现在尝试在多次迭代(一个for循环)中只使用一个套接字(每个线程1个)。
代码如下: 我的测试类(有硬编码的IP和端口,直到我可以让它正常工作):
代码如下: 我的测试类(有硬编码的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();
}
}
静态 void 入口点:
using( Foo foo = new Foo() ) {
for( int i = 0; i < 10; i++ ) {
foo.Execute();
}
}
错误
我收到的错误是在第一个循环成功完成后,出现了The operation is not allowed on non-connected sockets.
我理解错误的原因是(在响应被读取后,TcpClient.Client
关闭了),但我不知道如何明确告诉套接字保持打开状态。
编辑
进一步检查来自服务器的HTTP响应,它里面有 Connection: Close
。我假设由于这是原始TCP,它不会解析HTTP。这可能是问题的根源吗?(如果是,是否有忽略它的方法)
Dispose
应该可能调用Close
。但我不认为没有令人信服的理由不将Close
重命名为Dispose
。也许是与Open
对称,但实际上Close
只是处置而已。 - cHao