RMI 구현

RMI 구현은 세 가지 추상화 계층으로 구성됩니다.

추상화 계층은 다음과 같습니다.
  1. 스텁 및 스켈레톤 계층 - 클라이언트에서 인터페이스 참조 변수에 대한 메소드 호출을 인터셉트하고 이러한 호출을 원격 RMI 서비스로 경로를 재지정합니다.
  2. 원격 참조 계층 - 원격 서비스 오브젝트에 대해 클라이언트에서 작성된 참조를 해석하고 관리하는 방식을 이해합니다.
  3. 전송 계층 - 맨 아래 계층이며 네트워크에서 시스템 간의 TCP/IP 연결을 기반으로 합니다. 방화벽 통과 전략 및 기본 연결성을 제공합니다.
이 다이어그램은 RMI 시스템을 통해 클라이언트 프로그램과 서버 프로그램 간의 관계를 표시합니다. RMI 시스템은 전송 계층으로 링크된 클라이언트 및 서버 측 모두에서 스텁 및 스켈레톤과 원격 참조 계층으로 구성됩니다.

TCP/IP 계층의 맨 위에서 RMI는 다음과 같이 작동하는 JRMP (Java™ Remote Method Protocol) 라는 연결 레벨 프로토콜을 사용합니다.

  1. 원격 동작이 필요한 오브젝트는 일반적으로 UnicastRemoteObject 서브클래스를 통해 RemoteObject 클래스를 확장해야 합니다.
    1. UnicastRemoteObject 서브클래스는 원격 오브젝트를 내보내기하여 수신 RMI 호출 서비스에 대해 사용 가능하게 합니다.
    2. 원격 오브젝트를 내보내면 새로운 소켓이 작성되어 포트 번호에 바인드됩니다.
    3. 해당 소켓에 대한 연결을 청취하는 스레드도 작성됩니다. 서버가 레지스트리에 등록됩니다.
    4. 클라이언트는 레지스트리에서 서버에 대한 연결의 세부사항을 얻습니다.
    5. 서버 청취 소켓의 포트 세부사항 및 호스트 이름을 포함하는 레지스트리의 정보를 사용하여 클라이언트는 서버에 연결합니다.
  2. 클라이언트가 서버에 원격 메소드 호출을 발행하는 경우 TCPConnection 오브젝트가 작성되고 이는 지정된 포트의 서버에 대한 소켓을 열고 RMI 헤더 정보와 마샬링된 인수를 StreamRemoteCall 클래스를 사용하는 이 연결을 통해 전송합니다.
  3. 서버 측:
    1. 클라이언트가 서버 소켓에 연결하면 수신 호출을 처리하도록 새 스레드가 지정됩니다. 원래 스레드는 다른 클라이언트의 추가 호출이 작성될 수 있도록 원래 소켓을 계속 청취합니다.
    2. 서버는 헤더 정보를 읽고 소켓에서 RMI 인수를 마샬링 해제하기 위해 해당하는 RemoteCall 오브젝트를 작성합니다.
    3. Transport 클래스의 serviceCall() 메소드는 이를 디스패치하여 수신 호출을 처리합니다.
    4. dispatch()메소드는 오브젝트에서 적절한 메소드를 호출한 후 해당 결과를 다시 푸시합니다.
    5. 서버 오브젝트에서 예외 처리가 발생하는 경우 서버가 이를 발견하고 리턴값 대신 이를 마샬링합니다.
  4. 다시 클라이언트 측:
    1. RMI의 리턴값이 마샬링 해제되고 스텁에서 다시 클라이언트 코드로 리턴됩니다.
    2. 서버에서 예외가 발생하면 스텁에서 마샬링 해제되고 예외 처리됩니다.