1

我正在开发一个银行客户端-服务器架构。

我想知道组织服务器端最方便的方法是什么。银行是否需要在同一个文件中作为服务器和图形用户界面?

因为目前我有实例化银行的服务器 GUI。这家银行有一个客户列表,每个客户都有几个账户。

  1. 我的第一个问题涉及服务器 GUI 中的 JTable。实际上,银行存储了一个 ArrayList,其中包含客户先前完成的每个操作。我写了一个 AbstractTableModel 的实现,它也存储了一个 ArrayList。问题是服务器为 JTable 实例化了一个 Bank 和一个 TableModel。因此,当银行在其 ArrayList 中添加一个操作时,TableModel 并没有意识到这一点。如何在不将 TableModel 提供给 Bank 的情况下将这两者联系起来?

  2. 第二个问题涉及与客户端的连接。当登录名/密码正确时,服务器将会话接口传递给客户端。会话包含客户可以执行的银行操作。如果 SessionImpl 封装了 Bank 实例,是否存在安全问题?因为实际上 Session 方法调用了 Bank 方法。会话是客户端和服务器之间唯一的远程对象,但封装银行给我的印象是客户端可以直接访问银行。

4

1 回答 1

1

1)您希望您的 AbstractTableModel 在构造函数中采用 Bank 对象。然后,AbstractTableModel 方法委托给 Bank 对象上的底层操作列表。

有两种方法可以解决如果银行对象更改问题会发生什么。

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 和您的服务器应该是两个不同的对象。您的 GUI 是您的客户端,您的服务器端根本不应该有 GUI 代码。

于 2012-12-03T17:12:47.520 回答