2011-02-02 58 views
4

私は定期的に(1秒ごとに)plcと通信する必要があります。メッセージを送信してメッセージを受け取ります。この通信にはSocketクラスを使用します。接続(socket=new Socket(ipaddress, port))を開き、messagethen socket.close()などを送信するか、またはいつもソケットopetを保持するために1秒ごとに必要ですか?ソケットを開いて1秒間閉じるか開いたままにする

答えて

8

私はあなたがここにTCPソケットの話をしていると仮定します... TCP接続の設定に関与明白な非効率性から離れて

は毎秒あなたも( TIME_WAITにソケットを蓄積してしまう可能性が高いですうまくいけばあなたのクライアントに)。

私はおよそTIME_WAITを書いてきたし、それは私のブログに、ここでのサーバの拡張性と安定性に関して発生した問題:http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

は、(1秒に1回は240につながるあなたはソケットを開閉している率を考えます(60 * 4)ソケットは通常の(4分)2MSL TIME_WAITの期間にTIME_WAITに座っています)これは、TIME_WAITソケットがクライアント上で終わっていると仮定して、あまり問題はないはずです。毎秒たくさんのサーバーに接続していませんが...毎秒サーバーに接続するクライアントがたくさんあり、サーバーがソケットを蓄積していないことを確認していない場合は、TIME_WAIT状態では、サーバーのスケーラビリティが制限されることがあります。

代わりに、ソケット接続を開いたままにして、障害が発生した場合にのみ開いてください。これは最初にプログラムするのがやや複雑ですが、この方法で接続をプールするほうがかなり効率的です(データを送信するだけで、TCPハンドシェイクを行う必要はありません接続を確立する)、クライアント上ではるかに多くのリソースを効率的に使用できます。あなたは240ソケットを永久に保持していませんTIME_WAIT

3

クライアントは永続的に接続され、クライアントは常にサーバーに接続できます。しかし、このアプローチのパフォーマンスは、サーバーの実装方法によって異なります。スレッドモデル(クライアント接続ごとに1つのスレッド)を使用する場合、多くのクライアント接続を処理する際にリソースが不足する可能性があります。 「計算」が長生きしていない限り、サーバーが要求を処理するためのイベントベースのアプローチを使用する場合は、永続的なクライアントアプローチを使用することをお勧めします。

いつものように、あなたのユースケースに基づいたベンチマークであり、あなたは良いことがあります。

4

ソケットを常に接続し続けると、ネットワークトラフィックとクライアントの計算時間が短縮されます。ただし、サーバがブロッキングI/Oを使用している場合、多くのクライアントが接続されたままになると、接続スレッドが不足することがあります。また、タイムアウト、ネットワークの問題、およびサーバーのダウンタイムのために、切断された接続に対処する必要があります。

関連する問題