7

私は現在、C# からネットワーク コンポーネントを持つ Java に API を翻訳しています。

C# バージョンは、そのクラスが使用されている間、入出力ストリームとソケットを開いたままにしているようです。

これは正しいです?

アプリケーションがコマンドを送信し、ユーザー入力に基づいてイベントを受信して​​いることを念頭に置いて、「メッセージ」ごとに新しいソケットストリームを開く方が賢明ですか?

サーバーがイベントをスローするのをリッスンするために ServerSocket を維持していますが、アウトバウンド通信用のソケットと出力ストリームを維持することが非常に良い考えであるかどうかはわかりません。

私はソケットプログラミングにあまり慣れていません。多くの開発者と同様に、私は通常、ネットワーキングを行う必要があるときはアプリケーション層で作業し、ソケット層では作業しません。大学でこの作業を行ってから 5、6 年が経ちました。

助けて乾杯。これは、決定的な答えを求めるというよりも、アドバイスを求めていると思います。

4

7 に答える 7

16

接続を開いたままにしておくコストと、それらの接続を作成するコストの間にはトレードオフがあります。

接続の作成には、時間と帯域幅がかかります。3 方向の TCP ハンドシェイクを実行し、新しいサーバー スレッドを起動する必要があります...

接続を開いたままにしておくと、主にメモリと接続にコストがかかります。ネットワーク接続は、OS によって制限されるリソースです。接続しているクライアントが多すぎると、使用可能な接続が不足する可能性があります。関連付けられた状態で、接続ごとに 1 つのスレッドを開くため、メモリが消費されます。

適切なバランスは、予想される使用法に基づいて異なります。短時間に多数のクライアントが接続している場合は、おそらく接続を閉じる方が効率的です。長期間接続しているクライアントがほとんどない場合は、おそらく接続を開いたままにしておく必要があります...

于 2009-02-06T11:18:01.080 に答える
3

クライアントとサーバーにソケットが 1 つしかない場合は、できるだけ長く開いたままにしておく必要があります。

于 2009-02-06T11:18:40.393 に答える
2

ユーザーがコマンドを入力する頻度によって異なります。まれにしか発生しない場合は、ソケットを閉じることができます。頻繁にソケットを作成すると、コストのかかる操作になる可能性があります。

そうは言っても、まれなデータ用にソケット接続を開いておくと、マシン リソースの点でどれくらいコストがかかるのでしょうか? 「アウトバウンド通信のためにソケットと出力ストリームを維持することはあまり良い考えではない」と正確に考えるのはなぜですか(それは正しいことのように思えますが)? 一方、他のプロセスが同じファイルを使用する可能性があると予想される場合、ファイル ストリームの場合は異なります。この場合、ファイル ストリームをすばやく閉じることが最善の方法です。

作成できる多くの TCP 接続が使い果たされる可能性はどのくらいありますか? アウトバウンド接続を行う他のプロセスが使用する可能性があるのはどれですか? または、一度に多数のクライアントがサーバーに接続することが予想されますか?

于 2009-02-06T10:57:47.237 に答える
0

ActiveMQ や Netty などの既存のメッセージング ソリューションの使用を検討することをお勧めします。これにより、メッセージングで発生する可能性のある多くの問題が処理されます。

于 2009-02-06T21:37:20.287 に答える