2009-02-27 15 views
0

IRコマンドをルーティングする目的でGlobalCache GC-100-12と通信するサーバーアプリケーション(シングルトン、シンプルな.NETコンソールアプリケーション)があります。ローカルネットワーク上のさまざまな.NET WinFormクライアントがサーバーアプリケーションに接続し、ASCIIコマンドを送信します。サーバアプリケーションはこれらのASCIIコマンドをキューに入れ、TCP接続を介してGC-100-12に送信します。C#でこのTCP接続を処理する好ましい方法は何ですか?

私の質問は、サーバーの観点からこの接続を処理する最良の方法は何ですか?

  1. 個々のリクエストごとに新しいTcpClientを作成して開きます。要求が完了したら、TcpClientを閉じます。

  2. サーバーの起動時に1つのTcpClientを作成して開き、必要に応じてキープアライブを使用して、サーバーオブジェクトの有効期間中に接続を開いたままにします。

私はこの質問に、それぞれのリクエストに対して新しいTcpClientを作成するオーバーヘッドについて疑問を抱きます。それは高価な操作ですか?これは悪い習慣ですか?

現在、私は#1を実行しており、各送信の結果をコンソールに出力しています。場合によっては、いくつかの接続タイムアウトとコマンドがルーティングされない場合があります。そのたびに新しいTcpConnectionを作成するオーバーヘッドがあるかどうか、またはそれが別のものに起因するのかどうか疑問に思っていました。

接続が落ちた場合は再作成する必要があり、その状況を処理するにはもう少しコードが必要になるため、#2がより複雑になることがわかります。

これに関する一般的なアドバイスをお探ししています。私は、TcpClientクラスの経験が豊富です。

答えて

3

私たちは、古いPICKベースのシステムへのtelnetセッションを開くという同じような場合がありました。リクエストが来るたびにTCP接続を開くコストはかなり高価でした。私たちは、接続を開いたままにするためのノーオペレーションルーチンを実装することに決めました。より複雑ですが、エンドポイントが多くのクライアントにサービスを提供していない限り、接続を固定することは実行可能なソリューションのように聞こえます。

トラフィックがないときに接続を開いたままにしないようにするには、タイムアウトを設定することもできます。 5分間活動がない場合は、接続をシャットダウンします。

関連する問題