これにはいくつかの方法があり、それぞれに利点と欠点が関連付けられています。
1)双方向ライフライン
このソリューションでは、サーバーとクライアントの両方の効果永遠にブロックlifeline()
メソッドを持っているでしょう。接続が切断された場合、このメソッド呼び出しですぐにRemoteException
がスローされます。クライアントが呼び出しを開始した場合、クライアントはサーバーに再接続を試みるか、終了することができます。サーバは、クライアントが接続を切断した場合(サーバがclient.lifeline()
を呼び出すときに例外によって検出された場合)、クライアントによって呼び出されたserver.lifeline()
が返すようなロジックを維持する必要があります。そうしないと、サーバーのメモリが不足するまで
利点:接続が切断されるとすぐに通知されます。
欠点:接続ごとにサーバーとクライアント上の新しいスレッドを維持し、より複雑な切断ロジックを維持する必要があります。
2)ハートビートこの場合
、上に接続されたクライアントごとに数秒ごとに、あなたはまだserver.ping()
数秒ごとに呼び出して、各クライアント上で一つのスレッドを持っていますが、あなただけのclient.ping()
を呼び出してサーバー上の1つのスレッドを必要とします平均。 ping()
呼び出しで例外が発生した場合は、切断されていることがわかります。
利点:よりシンプルな接続ロジック、接続状態を管理する少数のスレッドによるサーバー上で消費少ない資源。
欠点:ping()
コールの失敗時にTCP応答が遅くなり、応答時間が遅くなります(ping呼び出し間の遅延まで)。
だから最善のルートは何ですか?
私はこれがあなたのアプリがやろうとしていることに完全に依存していると思います。できるだけ早くネットワークの状態に関する最新の最新の情報が必要な場合は、最初の方法を使用してください。切断を検出する際の遅延を許容できる場合は、2番目の方法が優れています。
第3の選択肢は、RMIのServer/SocketFactory
実装の使用法を調べ、リモートオブジェクトをRMIによって作成された特定のソケットにリンクしようとすることです。私は前にこれをやったことがありますが、それは迅速な解決策ではありませんが、最小のオーバーヘッドで両方の世界のベストを与えることができます。
ありがとうございました。これで各オブジェクトの 'unrefrenced()'がサーバに通知されるようになりました。どうやってやるの? –
Eh?これは、クライアントがなくなると自動的にサーバーで実行されます。 Javadocを読んでください。 – EJP