2011-05-16 3 views
0

나는 문제가 있습니다. 우선 컨텍스트를 설명하겠습니다.자바 RMI, 웹 서버에서 인터페이스가 원격 서버로 게시되는데, 그렇지 않아야합니다.

프로젝트는 단순한 프로젝트이므로 RMI에 익숙해졌습니다. 이 프로젝트는 주식 시장 서버 및 서버에서 자금에 대한 데이터를 가져 오는 클라이언트입니다.

나는 3 개의 자바 프로젝트로 프로젝트를 나눴다. 서버 (MockStockMarket 및 Fund), 클라이언트 (GUI 클래스 및 서버와 통신 할 클래스 : BannerController) 및 클라이언트와 서버 모두에 필요한 인터페이스가있는 프로젝트 (IStockMarket 및 IFund).

저는 bannerController가 자금을 확보 할 수 있도록 내 bannerController가 StockMarket과 이야기하기를 원합니다. 이것은 getFunds() : ArrayList를 사용하여 수행됩니다.

보시다시피 StockMarket은 원격이어야하며 기금은 일련 화 가능해야합니다.

IStockMarket market = new MockStockMarket(); 
Naming.rebind("rmi://localhost/StockMarket", market); 

(아니다으로) 두 IStockMarket (의도 한대로)와 IFund 원격 될 :

문제는 내가 다음 코드를 사용하는 몇 가지 이유입니다. 그건 내가 원하는 것이 아니야.

펀드는 Serializable을 확장하는 IFund를 구현하고 (원격은 없으므로) MockStockMarket은 UnicastRemoteObject를 확장하고 Remote를 확장하는 IStockMarket을 구현합니다.

여기 웹 서버 게시 인터페이스의 스크린 샷은 http://imageshack.us/m/194/4755/rmibothinterfacespublis.png입니다. soure 코드를

: 포트에 RMI 서비스를 바인딩 https://rapidshare.com/files/2085773800/stockmarket.zip

답변

0

오크 사이트에서 발견 : http://download.oracle.com/javase/tutorial/rmi/implementing.html.

웹 서버가 RMI 방법을 통해 전달 되었기 때문에 IFUND (비 원격) 인터페이스를 게시하고 있습니다. 내 클라이언트가 전달 된 개체를 사용하려면 IFund가 필요합니다. RMI가 작동하기에 충분하다고 생각했습니다.

내가 모르는 부분은 클라이언트가 객체를 deserialize하고 복사 된 객체의 메소드를 사용할 수 있도록 클래스 구현을 다운로드해야한다는 것입니다. 이를 위해서는 클라이언트 측에서 securitymanager를 사용해야합니다.매우 쉽습니다 :

if (System.getSecurityManager() == null) 
{ 
    System.setSecurityManager(new SecurityManager()); 
} 
+0

웹 서버가 '게시'하지 않습니다. RMI 코드베이스 클라이언트에 의해 발행 된 GET 요청에 대한 응답으로 * 코드베이스 위치에서 * 반환 *합니다. – EJP

+0

다른 jvms 용 파일을 코드베이스에서 다운로드하기 위해 파일을 게시 중입니다 ... – Rob

+0

코드베이스에 파일을 게시하여 * 파일 *을 게시했습니다. 원격 인터페이스의 클래스 로딩을 만족시키기 위해 필요합니다. 당신에게 어떤 대안이있는 것 같지 않습니다. – EJP

1

는 웹 서버 게시 파일과 다릅니다. 첨부 한 스크린 샷은 IStockMarket.class 및 IFund.class 파일이 RMI 서비스에 "바인딩"하는 것과 아무런 관련이없는 HTTP 리소스로 표시된다는 것을 보여줍니다. 제 해석이 잘못 되었다면 더 자세히 설명해주십시오. 답해 드리겠습니다.

+0

글쎄, 내 서버를 시작할 때 웹 서버는 그 두 클래스가 노출되었음을 보여줍니다. 그러나 하나의 IFund가되어서는 안됩니다. 또한 클라이언트가 IFund 객체를 가져 오면 객체를 직렬화 해제하는 대신 원격 객체로 사용하려고 시도합니다. – Rob

1

IStockMarket (의도 한 것) 및 IFund (의도 한 것은 아님)가 모두 원격이됩니다.

아니요. 오브젝트는 익스포트 됨으로써 '리모트가됩니다', 인터페이스는 '리모트가되지 않습니다'. 아마도 IFtund는 IStockMarket 인터페이스에 나타나기 때문에 클라이언트가 필요합니다. 코드베이스 기능을 사용하고있는 것으로 보입니다. 코드베이스의 관점에서 레지스트리도 클라이언트입니다. 따라서 레지스트리는 IFund.class와 IStockMarket.class를 다운로드했습니다. 그렇다고해서 IFund가 어떤 형태 나 형태로든 원만하게되지는 않습니다.

관련 문제