【发布时间】:2012-07-23 17:33:59
【问题描述】:
在与多线程和套接字消耗的兼容性方面,我遇到了 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();
}
}
错误
在 for 循环的第一次迭代成功完成后,我收到的错误是 The operation is not allowed on non-connected sockets.。
我了解错误的原因,(读取响应后TcpClient.Client 关闭),但我不知道如何明确告诉套接字保持打开状态。
编辑
进一步检查我从服务器返回的 HTTP 响应,其中包含 Connection: Close。我假设因为这是原始 TCP,所以它不会解析 HTTP。这可能是问题的根源吗? (如果是有没有办法忽略它)
【问题讨论】:
标签: c# tcp tcpclient system.net.sockets