質問: ### 前提・実現したいこと 当方サーバ、C#の勉強中であります。 C#でTCP通信のサーバを作成しております。 複数クライアントを想定しております。複数というのは同時に0~100万のクライアントを想定しております。 クライアントは1~1000番あるファイルの中の「ファイル■番の●文字から●●文字まで送ってというリクエスト」を送ります。 サーバは接続してきたクライアントに、「ファイル■番の●文字目から●●文字目まで」お送るという工程をします。 データのやり取りが終了したら切断します。 プログラムの流れは TcpListenerで随時、リクエストしてきたクライアントをTcp接続承認 ↓ クライアント毎にスレッドを作成 ↓ ===スレッド毎==== クライアントからデータを受信 ↓ 受信データから指定ファイルをバッファに読み込む ↓ ●文字目から●●文字目まで抽出 ↓ クライアントへデータを送信 ↓ 切断 ===スレッド毎==== というものにしようかと思っております。 つまり、1スレッド1クライアントとなります。 その一つ一つのスレッド毎の中でファイルを読み込み、からデータ送受信 、切断を行います。 そこでなのですが、各ファイルのサイズが2Mbyteとしたとき、万が一にも 100万のクライアントが一気にリクエストをサーバに送った時、サーバは固まると思います。(メモリ不足)そこで、 1【ある一定数の接続されたクライアントがいるときは、TcpListnerを停止】もしくは、 2【スレッドを使わずにクライアントが1つ接続していればTcpListenerを停止】させようかと思っております。(1つずつ接続はサーバとしてどうなのか。。。) なので、リクエストをだしたクライアントには返事が帰ってこないので、 返事が帰ってこないときは定期的にさらにリクエストを出してもらおうと思っております。 ここで、上記の仕様に改善点等のご指摘を下さるとうれしいです。 また、実際のサーバプログラムはどのようなものなのかご教授下さるとうれしいです。URLでも嬉しいです。 尚今のところ2で考えております。 ### 補足情報(言語/FW/ツール等のバージョンなど) VisualSudio2015 C# NET4.5 ### 追記 ご回答有難うございます。ご回答いただいたリンク等で勉強させて頂き、何を使うか検討させて頂きます。
回答: > > 参考となるURL > > > 非同期サーバー ソケットの例.aspx) サーバーは極力軽く作って、大量の処理を行う前提で上記のサンプルは有効でしょうか? いろいろ非同期で作成して、DBアクセスや、ファイルアクセスも非同期で行う事が望ましいと思います。 スレッド生成はコストが高いですから、非同期で少ないスレッドで次々処理する方が得策だと思います。 nodejs での実装のようですが、実際に 運用されている人の記事 が参考になります。 ある程度を超えると、やはり性能チューニングのためにライブラリに任せず、自分で細かいコードを書いているようです。