1

私は銀行のクライアントサーバーアーキテクチャを開発しています。

サーバー側を整理するための最も便利な方法を知りたいです。銀行は同じファイル内のサーバーとGUIである必要がありますか?

現在、銀行をインスタンス化するサーバーGUIがあるためです。この銀行には顧客のリストがあり、各顧客には複数のアカウントがあります。

  1. 私の最初の問題は、サーバーGUIのJTableに関するものです。実際、銀行は以前にクライアントによって実行されたすべての操作のArrayListを格納します。ArrayListも格納するAbstractTableModelの実装を作成しました。問題は、サーバーがJTableのバンクとTableModelをインスタンス化することです。したがって、銀行がArrayListにオペレーションを追加するとき、TableModelはそれを認識しません。TableModelを銀行に渡さずにこれら2つをリンクするにはどうすればよいですか?

  2. 2番目の問題は、クライアントとの接続に関するものです。ログイン/パスワードが正しい場合、サーバーはセッションインターフェイスをクライアントに渡します。セッションには、クライアントが実行できる銀行業務が含まれます。SessionImplがBankインスタンスをカプセル化する場合、それはセキュリティの問題ですか?実際には、SessionメソッドはBankメソッドを呼び出すためです。セッションはクライアントとサーバー間の唯一のリモートオブジェクトですが、バンクをカプセル化すると、クライアントがバンクに直接アクセスできるという印象を与えます。

4

1 に答える 1

1

1)AbstractTableModelがコンストラクターでBankオブジェクトを取得するようにします。次に、AbstractTableModelメソッドは、Bankオブジェクトの操作の基になるリストに委任します。

銀行オブジェクトが問題を変更した場合に何が起こるかを解決するには、2つの方法があります。

a)メソッドを使用してBankオブジェクトを想定する:

public List<Operation> getOperations();

getOperations()テーブルモデルにリクエストが送信されるたびに呼び出すことができます。例えば:

public Object getValueAt(int row, int column) {
  return bank.getOperations().get(row)...
}

これは遅いですが、更新を取得する簡単な方法です。

b)より複雑な方法では、AbstractTableModelをBankオブジェクトに登録して、新しい操作がBankに追加されたときにイベントを受信します。これは次のようになります。

public class BankTableModel extends AbstractTableModel {
  private List<Operation> operations;

  public BankTableModel(Bank bank) {
    operations = bank.getOperations();
    bank.addOperationEventListener(...);
  }

  public Object getValueAt(int row, int column) {
    return operations.get(row)...
  }
}

これに伴う問題は、RMIがサーバーがクライアントと通信するためのメカニズムを提供しないため、サーバーとクライアントの両方がRMIエンドポイントである必要があることです。RMIイベントを参照してください。

2)RMIの要点は、サーバー上に存在するリモートオブジェクトのスタブを取得することです。スタブを使用すると、リモートオブジェクトがローカルであるかのように、そのオブジェクトのメソッドを呼び出すことができます。特にアカデミックな設定では、このレベルのセキュリティについて心配する必要はありません。

Sessionオブジェクトを取り除き、Bankオブジェクトを直接返します。すべての呼び出しをBankオブジェクトに転送する場合は、実際にはBankオブジェクトと直接対話する必要があります。より複雑なシステムでは、プロキシまたはファサードレイヤーを追加する正当な理由があるかもしれませんが、この場合は単純にしておきます。

3)GUIとサーバーは2つの異なるオブジェクトである必要があります。GUIはクライアントであり、サーバー側にはGUIコードがまったくないはずです。

于 2012-12-03T17:12:47.520 に答える