マルチスレッドおよびソケット消費との互換性に関して、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を解析しないと思いました。これが問題の原因でしょうか?(もしそうなら、それを無視する方法があります)