0

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

私の質問は、サーバーの観点からこの接続を処理する最良の方法は何ですか? 次の 2 つの方法が考えられます。

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

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

リクエストごとに新しい TcpClient を作成するオーバーヘッドが気になるので、この質問をします。高額な手術ですか?これは悪い習慣ですか?

現在、私は #1 を実行しており、各送信の結果をコンソールに出力しています。時折、一部の接続がタイムアウトし、コマンドがルーティングされないことがあります。これは、毎回新しい TcpConnection を作成するオーバーヘッドが原因なのか、それとも何か他のことが原因なのか疑問に思っていました。

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

これに関する一般的なアドバイスを探しています。TcpClient クラスを扱った経験はあまりありません。

4

1 に答える 1

3

古いPICKベースのシステムへのtelnetセッションを開くという同様のケースがありました。リクエストが着信するたびにTCP接続を開くコストはかなり高いことがわかり、接続を開いたままにするためにno-opルーチンを実装することにしました。それはもっと複雑ですが、エンドポイントが多くのクライアントにサービスを提供しようとしない限り、接続を固定することは実行可能な解決策のように思えます。

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

于 2009-02-27T16:13:30.347 に答える