在与多线程和套接字消耗的兼容性方面,我遇到了 System.Net.WebRequest 和 System.Net.HttpRequest 的问题。我试图降低一个级别并推出我自己的简单 Http 类。
由于之前的问题是每个线程太快地创建了太多的套接字,我试图在多次迭代(一个 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();
}
}
错误
我收到的错误是The operation is not allowed on non-connected sockets.
在 for 循环的第一次迭代成功完成之后。
我了解错误的原因,(读取响应后TcpClient.Client
关闭),但我不知道如何明确告诉套接字保持打开状态。
编辑
进一步检查我从其中包含的服务器返回的 HTTP 响应Connection: Close
。我假设因为这是原始 TCP,所以它不会解析 HTTP。这可能是问题的根源吗?(如果是有没有办法忽略它)