2011-07-09 11 views
3

うまくいけば、2つの簡単な質問:サーバアーキテクチャサーバ・アプリケーションの作成に関連する

  • 開くことができる同時ソケットの数に実用的/理論上の制限はありますか?一度データが到着すると、そのデータを処理するために必要なリソースは無視されます。その妥当性の私は、.NET Framework
  • をターゲットにしていた場合は行われ、各接続が永続的に割り当てられている別のスレッドで実行する必要があり、またはスレッドプールを使用する必要がありますか?専用スレッドのアプローチは簡単ですが、100以上のスレッドを1回実行するのは奇妙に思えます。これは容認できる習慣ですか?

は何かアドバイスは私の記憶が正しけれとしてそれらを実装するための非常に最良の方法は、非同期コールバックを使用してReceiveAsync(.NET 3.5)/ BeginReceiveメソッドである(前ソケットに長い時間がなかった)Venatu

+1

あなたは複数の人が、あなたは、接続ごとに少なくとも1つのスレッドが必要になります、一度に接続できるようにしたいと仮定。 – Jordan

+0

着信要求を受け入れる専用のスレッドで、限られた数のスレッドで順番にソケットを循環させることはできませんか? – Venatu

+0

これは可能ですが、長時間接続をしている場合は非常に長いキューを持つリスクがあります。私が「スレッド」と言うとき、私は実際には「非同期的にデータを送受信する方法」を意味するので、ThreadPoolingまたは非同期ソケットも機能します。 – Jordan

答えて

2

あなたはfollowing answerが役に立つかもしれません。これは、.NETスレッドプールおよび非同期ソケットメソッド(BeginAccept/EndAcceptおよびBeginReceive/EndReceive)を使用してスケーラブルなTCPサーバーを作成する方法を示しています。

これは、多数のWCFバインディングの1つを使用したり、カスタムWCFバインディングを作成したりして、WCFインフラストラクチャの全面的な利点から利益を得ることができるときは、独自のサーバーを作成することはめったにありません。それはおそらく、すべての特製のサーバーよりも優れているでしょう。

+0

200,000 +うわー、あなたは単にロッキングしています。 – kobe

+0

ありがとうございました。私が頭に入れていたことと同じパターンを提供しました。私はすでにbegin/end acceptを使用していました。それは私に完璧に必要な解決! wcfの記載に感謝しますが、残念ながらサーバーは.netのみです。クライアントはアンドロイドアプリであり、帯域幅が狭いことを意味します。また、接続は常に(その単純なマルチプレイヤーゲームで)wcfはhttp/soapベースですか?私は生のソケットに比べてwcfのシンプルさを愛していますが、この場合は選択肢がないと思います。うまくいけば、私はwcfについて間違った仮定を持っていないはずです! – Venatu

+1

@Venatu、あなたはWCFに関する間違った仮定をしていません。 HTTP/SOAPベースに限定されません。 TCP経由でバイナリバインディングを使用することができます。それらはあまり相互運用できないかもしれませんが、あなたがカスタムプロトコルを使用する場合はカスタムバインディングを記述することができます。それは非常にカスタマイズ可能で、それがその力です。また、HTTPよりもRESTまたはPOXを使用することもできます。これはSOAPよりも最適化できます。だから私はあなたに向かって1つのアドバイスがあった場合:NETプラットフォーム上のサーバーをホストする場合はWCFを使用します。 –

1

感謝大幅にされていますスレッドプールを利用します。接続ごとにスレッドを開かないでください。リソースの無駄です。

2

実用的な制限があります。しかし、負荷を処理するためにリソースが不足する可能性が非常に高いです。 CPU、またはメモリが接続数よりも先に使い果たされる可能性があります。

は、最大のスケーラビリティのために、あなたは、接続ごとに別々のスレッドを望んでいないのではなく、あなたのネットワーク(受信またはデータを送信するように)アクティブなサービスを提供する場合のみ、スレッドを使用する非同期モデルを使用します。

関連する問題