我正在开发一个Banking Client-Server架构。
我想知道组织服务器端最方便的方法是什么。 银行是否需要成为同一文件中的服务器和GUI?
因为目前我有实例化Bank的服务器GUI。本行有一份客户名单,每个客户都有几个账户。
我的第一个问题涉及服务器GUI中的JTable。实际上,Bank存储了先前由客户端执行的每个操作的ArrayList。我编写了AbstractTableModel的实现,它也存储了一个ArrayList。问题是服务器为JTable实例化Bank和TableModel。因此,当Bank在其ArrayList中添加Operation时,TableModel不知道这一点。如何在不将TableModel提供给Bank的情况下链接这两个?
第二个问题涉及与客户的连接。当登录/密码正确时,服务器将会话接口传递给客户端。会话包含客户可以执行的银行业务。如果SessionImpl封装了Bank实例,这是一个安全问题吗?因为实际上Session方法称为Bank方法。会话是客户端和服务器之间唯一的远程对象,但封装银行给我的印象是客户可以直接访问银行。
答案 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代码。