gpt4 book ai didi

java - 如何使用 GUI 组织服务器架构

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:32 25 4
gpt4 key购买 nike

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

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

因为目前我有实例化银行的服务器 GUI。该银行有一个客户名单,每个客户都有多个账户。

  1. 我的第一个问题涉及服务器 GUI 中的 JTable。事实上,银行存储了客户之前完成的每个操作的 ArrayList。我编写了 AbstractTableModel 的实现,它也存储了 ArrayList。问题在于服务器为 JTable 实例化了 Bank 和 TableModel。因此,当银行在其 ArrayList 中添加操作时,TableModel 不会意识到这一点。如何在不将 TableModel 提供给银行的情况下链接这两者?

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

最佳答案

1) 您希望 AbstractTableModel 在构造函数中采用 Bank 对象。然后,AbstractTableModel 方法将委托(delegate)给 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 Events .

2) RMI 的全部意义在于您获得驻留在服务器上的远程对象的 stub 。 stub 允许您调用远程对象上的方法,就好像该对象是本地对象一样。不必担心此级别的安全性,尤其是在学术环境中。

我会摆脱 Session 对象并直接返回 Bank 对象。如果您将所有调用转发给 Bank 对象,那么您实际上只想直接与 Bank 对象交互。在更复杂的系统中,您可能有合理的理由添加代理层或外观层,但在这种情况下我会保持简单。

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

关于java - 如何使用 GUI 组织服务器架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13686681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com