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

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