2012-12-03 2 views
1

저는 은행 클라이언트 - 서버 아키텍처를 개발 중입니다.GUI를 사용하여 서버 아키텍처를 구성하는 방법

서버 측을 구성하는 가장 편리한 방법을 알고 싶습니다. 은행은 서버와 GUI가 동일한 파일에 있어야합니까?

현재 은행을 인스턴스화하는 서버 GUI가 있기 때문에. 이 은행에는 고객 목록이 있으며 각 고객에는 여러 계정이 있습니다.

  1. 첫 번째 문제는 서버 GUI의 JTable과 관련이 있습니다. 실제로 Bank는 이전에 클라이언트가 수행 한 모든 작업에 대한 ArrayList를 저장합니다. 나는 또한 ArrayList를 저장하는 AbstractTableModel의 구현을 작성했습니다. 문제는 Server가 JTable 용 Bank 및 TableModel을 인스턴스화한다는 점입니다. 따라서 Bank가 ArrayList에 Operation을 추가하면 TableModel은이를 인식하지 못합니다. TableModel을 은행에주지 않고도이 두 가지를 어떻게 연결할 수 있습니까?

  2. 두 번째 문제점은 클라이언트와의 연결과 관련됩니다. 로그인/암호가 올 바르면 서버는 클라이언트에 세션 인터페이스를 전달합니다. 세션에는 클라이언트가 수행 할 수있는 뱅킹 작업이 포함됩니다. SessionImpl이 Bank 인스턴스를 캡슐화하면 보안 문제가 발생합니까? 왜냐하면 실제로 Session 메서드는 Bank 메서드를 호출하기 때문입니다. Session은 Client와 Server 사이의 유일한 원격 Object이지만 Bank를 캡슐화하면 Client가 Bank에 직접 액세스 할 수 있다는 인상을줍니다.

+0

서버 (EJB, 서블릿, 기타)에서 어떤 기술을 사용하고 있습니까? 왜 어떤 객체를 별도의 계층에두기로 결정 했습니까? – rancidfishbreath

+0

RMI를 사용하고 있습니다. 별도의 계층에서 무엇을 의미합니까? – xenom

+0

RMI는 매우 낮은 수준의 API이며 클라이언트 서버 응용 프로그램을 수행하는보다 복잡한 방법 중 하나입니다. 나는 당신이 기술을 선택한 이유와 그것을 사용하여 얻고 자하는 것을 이해하려고 노력하고 있습니다. 어쩌면 당신은 유효한 동기 인 RMI를 배우고 싶을 것입니다. 왜 우리가이 길로 내려 갔는지, 또는 정말로 당신이 성취하고자하는 것을 이해할 수있게 도와 준다면 더 나은 답을 얻을 수 있습니다. – rancidfishbreath

답변

1

1) AbstractTableModel이 생성자에서 Bank 객체를 사용하기를 원합니다. 그런 다음 AbstractTableModel 메소드는 Bank 객체의 기본 작업 목록에 위임합니다.

은행 객체가 문제를 변경하면 어떻게되는지 해결할 수있는 두 가지 방법이 있습니다.

A)하는 방법과 은행 객체를 가정 :

public List<Operation> getOperations(); 

당신은 요청이 테이블 모델로 될 때마다 getOperations() 호출 할 수 있습니다. 예를 들면 다음과 같습니다.

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

이것은 느리지 만 간단하지만 업데이트를 얻을 수있는 방법입니다.

b)보다 복잡한 방법으로 Bank에 새 작업이 추가 될 때 이벤트를 수신하는 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 객체에 전달하는 경우에는 Bank 객체와 직접 상호 작용하기를 원할 것입니다. 더 복잡한 시스템에서는 Proxy 또는 Facade 레이어를 추가하는 정당한 이유가있을 수 있지만이 경우 간단하게 유지합니다.

3) GUI와 서버가 서로 다른 두 개의 객체 여야합니다. 귀하의 GUI는 클라이언트이며 귀하의 서버 측에 GUI 코드가 없어야합니다.

+0

1) 답변 해 주셔서 감사합니다. 청중에 대해 효과적으로 생각하고 있다고 생각했습니다. 2) 실제로 보안 된 응용 프로그램이 필요합니다. 처음에는 전체 은행을 제공했지만 네트워킹 프로그래밍 프로젝트였습니다. 따라서 현실적이어야하며이 세션 아키텍처를 유지해야합니다. 나중에 SSL을 사용하여 RMI 연결을 보호 할 계획입니다. 3) 클라이언트와 서버 모두 GUI가 필요합니다. 실시간으로 모든 작업을 보여주는 서버 GUI에 대해 말하고있었습니다. 그게 내 JTable이야. – xenom

+0

그게 쉬운 일입니다. 은행에 작업이 추가되고 이벤트가 1b에서와 같이 AbstractTableModel에서 수신 될 때 이벤트를 시작하십시오. – rancidfishbreath

관련 문제