如何使用GUI组织服务器体系结构

时间:2012-12-03 15:43:52

标签: java jtable client-server abstracttablemodel

我正在开发一个Banking Client-Server架构。

我想知道组织服务器端最方便的方法是什么。 银行是否需要成为同一文件中的服务器和GUI?

因为目前我有实例化Bank的服务器GUI。本行有一份客户名单,每个客户都有几个账户。

  1. 我的第一个问题涉及服务器GUI中的JTable。实际上,Bank存储了先前由客户端执行的每个操作的ArrayList。我编写了AbstractTableModel的实现,它也存储了一个ArrayList。问题是服务器为JTable实例化Bank和TableModel。因此,当Bank在其ArrayList中添加Operation时,TableModel不知道这一点。如何在不将TableModel提供给Bank的情况下链接这两个?

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

1 个答案:

答案 0 :(得分: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)以更复杂的方式,您可以使用Bank对象的AbstractTableModel寄存器在向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 Events

2)RMI的重点是获取驻留在服务器上的远程对象的存根。存根允许您调用远程对象上的方法,就好像该对象是本地的一样。不要担心这个级别的安全性,特别是在学术环境中。

我会删除Session对象并直接返回Bank对象。如果要将所有调用转发到Bank对象,那么您真的只想直接与Bank对象进行交互。在一个更复杂的系统中,你可能有合理的理由添加代理或外观层,但在这种情况下我会保持简单。

3)您的GUI和服务器应该是两个不同的对象。您的GUI是您的客户端,服务器端应该没有GUI代码。