2016-09-30 8 views
3

Java RMI의 기초를 파악하려고합니다.Java RMI를 사용하면 원격 메소드 호출이 서버의 시간대 대신 클라이언트의 시간대를 생성하는 이유는 무엇입니까?

  • Client 서버
으로 실행하는 클라이언트
  • Server로 실행 :

    아이디어는 각각 두 개의 클래스 중 하나에 별도의 메인으로 준비하는 두 개의 별도의 프로세스가 실행하는 것입니다

    세 번째 클래스 인 Document은 공유 객체로 작동하며 (Strings의 간단한 수집 자임) 해당 메소드 addTimestamp()은 현재 Timestamp을 저장합니다. 콘솔에 추가 인쇄. 이 메서드는 DocumentInterface에 정의 된대로 원격 메서드로 사용할 수도 있습니다. 클라이언트의 출력은 예상대로 java -cp rmi.jar Client

  • :

    • Server : java -cp rmi.jar Server

    • Client

      두 개의 서로 다른 cmd 창에있는 두 개의 메인 실행은 완벽하게 작동하는 시스템을 산출 :

      년 9월 30일 01.53.01

      서버 -에 본 : -

      클라이언트에 조회 그래도 난 다른 시간대에 따라 서버를 시작하면 2016년 9월 30일 01.53.01

      :

      • Server : java -Duser.timezone=PST -cp rmi.jar Server

      • Client : java -cp rmi.jar Client

      는 원래 클라이언트 출력

      난 아직도 얻을 : - : 2016년 9월 30일 01.53.01

      서버 -에 조회 :

      클라이언트에 조회 2016년 9월 30일 01.53.01

      두 번째 줄에는 서버의 PST 기반 Timestamp이 있어야합니다. 나는 깃발이 서버의 메인에 의해 직접 인쇄되도록함으로써 올바르게 설정되었는지를 확인했다. 실제로는 다르다 :

      2016.09.29 16.55.

      현재 Document가 서버에 사본 전달
      • Timezone
      • 을 추가됩니다 : 지금까지 이해 한 내용을 원격 객체에 원격으로 addTimestamp() 메서드를 호출 할 때, 57

      서버에 의해 Document 클래스

    • 의 인스턴스를 사용하여 반환 된 Document은 클라이언트에 복사하여 전달합니다.
    • Document이 경우 클라이언트

    으로 표시됩니다 나는 이렇게 Timezone가 서버의 설정이 아닌 클라이언트를 기반으로 할 것으로 기대한다. 왜 이것이 사실이 아닌가?

    Document.java :

    public Document addTimestamp(Document document) throws RemoteException 
        { 
        String timestamp = new SimpleDateFormat("yyyy.MM.dd HH.mm.ss").format(new Date()); 
    
        document.strings.add("Viewed on: "+timestamp); 
    
        return document; 
        } 
    

    DocumentInterface.java :

    여기에 네 개의 클래스에서 일부 코드 조각은

    public interface DocumentInterface extends Remote 
        { 
        public Document addTimestamp(Document document) throws RemoteException; 
        } 
    

    Server.java - main :,

    Registry registry = LocateRegistry.createRegistry(1099); 
    Document document = new Document(); 
    Naming.bind("rmi:///Document", document); 
    

    Client.java-main : 내 보낸 원격 객체가

    Document document = new Document(); 
    DocumentInterface remoteDocument; 
    try 
        { 
        remoteDocument = (DocumentInterface) Naming.lookup("rmi:///Document"); 
    
        document.addString("USER - "); 
        document.addTimestamp(document); 
        document.addString("\n"); 
        document.addString("SERVER - "); 
        document = remoteDocument.addTimestamp(document); 
    
        System.out.println(document.toString()); 
        } 
    catch (Exception except) 
        { 
        } 
    
    +1

    addTimestamp 내에 시간을 인쇄하고 클라이언트 또는 서버 (인쇄 할 창에 따라)에서 실행되는지 여부를 확인할 수 있습니까? – immibis

    +0

    클라이언트의 창에 인쇄됩니다! 왜 그런가요? – Gliptal

    +0

    클라이언트에서 실행 중이기 때문입니다. 자, 왜 * 클라이언트에서 실행 중인지 모르겠습니다 ... – immibis

    답변

    1

    Document 때문에, 클라이언트에서 콜백으로 실행됩니다. 서버에서 복사하지 않습니다.

    원격 인터페이스 및 extends UnicastRemoteObject을 제거하고 직렬화 할 수있게 만드십시오.

    +0

    감사합니다. 만약 내가'Remote' 인터페이스를 제거했다면, 나는 더 이상 rmi 레지스트리에 바인드 할 수 없습니다. (binded 오브젝트는 반드시'Remote' 타입이어야합니다.) 클라이언트가 호출 할 수 있도록 콜백처럼 동작하지 않도록 서버가 바인드 한'Document '를 어떻게 가질 수 있습니까? – Gliptal

    +1

    클라이언트에서 새 문서를 만들거나 레지스트리에서 새 문서를 찾고 있는지 확인해야합니다. 현재 당신은 둘 다하고 있습니다. 일반적으로 이것은'Document' 원격 객체 클래스가 클라이언트에 존재하지 않기 때문에 불가능합니다. – EJP

    +0

    제가하고 싶은 것은 클라이언트가 바인드 된'Document'에 대한 레지스트리를보고 서버가 원격 메소드를 실행하도록하여 서버의 시간을 표시하도록하는 것입니다. 그런 다음 클라이언트'Document'를 사용하여 모든 것을 표시하고 동일한 메소드가 로컬에서 실행되면 다른 타임 스탬프를 제공합니다. – Gliptal