2012-12-03 63 views
1

我正在開發銀行客戶端 - 服務器體系結構。如何使用GUI組織服務器體系結構

我想知道什麼是最方便的方式來組織服務器端。 銀行是否需要成爲同一文件中的服務器和GUI?

因爲目前我有服務器GUI實例化一個銀行。本行有一個客戶名單,每個客戶有多個帳戶。

  1. 我的第一個問題涉及服務器GUI中的JTable。實際上,銀行存儲客戶以前完成的每個操作的ArrayList。我寫了一個也存儲ArrayList的AbstractTableModel的實現。問題是服務器爲JTable實例化一個Bank和一個TableModel。所以,當銀行在其ArrayList中添加一個操作時,TableModel不知道這一點。我怎樣才能將這兩個表格鏈接到銀行?

  2. 第二個問題涉及與客戶端的連接。當登錄/密碼正確時,服務器將會話接口傳遞給客戶端。會話包含客戶可以執行的銀行操作。如果SessionImpl封裝了銀行實例,這是否是一個安全問題?因爲實際上Session會調用Bank的方法。會話是客戶端和服務器之間唯一的遠程對象,但封裝銀行給我的印象是客戶可以直接訪問銀行。

+0

你在服務器上使用什麼樣的技術(EJB,Servlets,其他)?你爲什麼選擇在一個單獨的層上放置一些對象? – rancidfishbreath

+0

我正在使用RMI。你是什​​麼意思分開的層次? – xenom

+0

RMI是一個非常低級別的API,也是執行客戶端服務器應用程序的更復雜方法之一。我試圖弄清楚爲什麼選擇這項技術以及您希望從中獲得什麼。也許你想學習RMI,這是一個有效的動機。如果你能幫助我們理解你爲什麼沿着這條路線走下去,或者你真的想要完成什麼,那麼你將得到更好的答案。 – rancidfishbreath

回答

1

1)您希望AbstractTableModel在構造函數中使用Bank對象。 AbstractTableModel方法然後委託給Bank對象的基礎操作列表。

有兩種方法可以解決銀行對象更改問題時會發生的情況。

一)假設與方法的銀行對象:

public List<Operation> getOperations(); 

您只需撥打getOperations()每一個請求到表模型進行的時間。例如:

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

這很慢但是獲取更新的簡單方法。

b)以更復雜的方式,當將新操作添加到銀行時,您可以使用Bank對象的AbstractTableModel寄存器接收事件。這看起來像:

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對象進行交互。在更復雜的系統中,添加代理或外觀圖層可能有合理的理由,但在這種情況下,我會保持簡單。

3)您的GUI和您的服務器應該是兩個不同的對象。你的GUI是你的客戶端,你的服務器端應該沒有GUI代碼。

+0

1)感謝您的回答,我一直在想有效地思考聽衆。 2)其實我真的需要一個安全的應用程序,我開始時給了整個銀行,但它是網絡編程項目。所以它必須是現實的,我需要保持這個會話架構。我計劃稍後使用SSL保護RMI連接。 3)客戶端和服務器都需要一個GUI。我正在談論實時顯示每個操作的服務器GUI。這是我的JTable。 – xenom

+0

那就很容易了。只需在將操作添加到銀行並使AbstractTableModel監聽事件時觸發事件(如1b) – rancidfishbreath