logo

Java의 원격 메소드 호출

메모:
java.rmi 패키지 : 원격 메소드 호출(RMI)은 웹 서비스나 원격 프로시저 호출(RPC)과 같은 다른 원격 통신 메커니즘을 위해 Java 9 이상 버전에서 더 이상 사용되지 않습니다.

RMI(Remote Method Invocation)는 객체가 동일한 시스템이나 원격 시스템에 있을 수 있는 다른 주소 공간에 존재하는 객체의 메소드를 호출할 수 있도록 하는 API입니다. RMI를 통해 컴퓨터(클라이언트 측)에 있는 JVM에서 실행 중인 객체는 다른 JVM(서버 측)에 있는 객체에 대한 메서드를 호출할 수 있습니다. RMI는 서버 객체에 대한 간단한 메소드 호출을 통해 클라이언트와 서버측 통신을 가능하게 하는 공용 원격 서버 객체를 생성합니다.



스텁 객체: 클라이언트 시스템의 스텁 개체는 정보 블록을 구축하고 이 정보를 서버로 보냅니다.

블록은 다음과 같이 구성됩니다.

  • 사용할 원격 개체의 식별자
  • 호출할 메소드 이름
  • 원격 JVM에 대한 매개변수

뼈대 개체: 스켈레톤 객체는 스텁 객체의 요청을 원격 객체로 전달합니다. 다음과 같은 작업을 수행합니다.



  • 서버에 있는 실제 객체에 대해 원하는 메서드를 호출합니다.
  • 스텁 개체에서 받은 매개 변수를 메서드에 전달합니다.

RMI 작업

클라이언트와 서버 간의 통신은 두 개의 중간 개체인 Stub 개체(클라이언트 측)와 Skeleton 개체(서버 측)를 사용하여 처리되며 아래 미디어에서도 다음과 같이 설명할 수 있습니다.

아래에 정의된 대로 인터페이스를 구현하기 위해 순차적으로 따라야 하는 단계는 다음과 같습니다.



  1. 원격 인터페이스 정의
  2. 원격 인터페이스 구현
  3. rmic(RMI 컴파일러)를 사용하여 구현 클래스에서 Stub 및 Skeleton 객체 생성
  4. rmi레지스트리 시작
  5. 서버 응용프로그램 작성 및 실행
  6. 클라이언트 응용 프로그램을 생성하고 실행합니다.

1단계: 원격 인터페이스 정의

가장 먼저 해야 할 일은 원격 클라이언트가 호출할 수 있는 메서드에 대한 설명을 제공하는 인터페이스를 만드는 것입니다. 이 인터페이스는 Remote 인터페이스를 확장해야 하며 인터페이스 내의 메소드 프로토타입은 RemoteException을 발생시켜야 합니다.

예:

자바




// Creating a Search interface> import> java.rmi.*;> public> interface> Search>extends> Remote> {> >// Declaring the method prototype> >public> String query(String search)>throws> RemoteException;> }>

>

>

2단계: 원격 인터페이스 구현
다음 단계는 원격 인터페이스를 구현하는 것입니다. 원격 인터페이스를 구현하려면 해당 클래스를 java.rmi 패키지의 UnicastRemoteObject 클래스로 확장해야 합니다. 또한 클래스의 상위 생성자에서 java.rmi.RemoteException을 발생시키려면 기본 생성자를 생성해야 합니다.

자바


자바 정렬의 arraylist



// Java program to implement the Search interface> import> java.rmi.*;> import> java.rmi.server.*;> public> class> SearchQuery>extends> UnicastRemoteObject> >implements> Search> {> >// Default constructor to throw RemoteException> >// from its parent constructor> >SearchQuery()>throws> RemoteException> >{> >super>();> >}> >// Implementation of the query interface> >public> String query(String search)> >throws> RemoteException> >{> >String result;> >if> (search.equals(>'Reflection in Java'>))> >result =>'Found'>;> >else> >result =>'Not Found'>;> >return> result;> >}> }>

>

>

3단계: rmic를 사용하여 구현 클래스에서 Stub 및 Skeleton 개체 만들기
rmic 도구는 Stub 및 Skeleton 객체를 생성하는 rmi 컴파일러를 호출하는 데 사용됩니다. 프로토타입은 rmic 클래스 이름입니다. 위 프로그램의 경우 명령 프롬프트에서 다음 명령을 실행해야 합니다.
rmic 검색 쿼리.
4단계: rmiregistry 시작
명령 프롬프트 start rmiregistry에서 다음 명령을 실행하여 레지스트리 서비스를 시작합니다.
5단계: 서버 응용 프로그램 생성 및 실행
다음 단계는 서버 응용 프로그램을 작성하고 별도의 명령 프롬프트에서 실행하는 것입니다.

  • 서버 프로그램은 LocateRegistry 클래스의 createRegistry 메소드를 사용하여 인수로 전달된 포트 번호를 사용하여 서버 JVM 내에 rmiregistry를 생성합니다.
  • Naming 클래스의 rebind 메소드는 원격 객체를 새 이름에 바인딩하는 데 사용됩니다.

자바

목록노드




// Java program for server application> import> java.rmi.*;> import> java.rmi.registry.*;> public> class> SearchServer> {> >public> static> void> main(String args[])> >{> >try> >{> >// Create an object of the interface> >// implementation class> >Search obj =>new> SearchQuery();> >// rmiregistry within the server JVM with> >// port number 1900> >LocateRegistry.createRegistry(>1900>);> >// Binds the remote object by the name> >// geeksforgeeks> >Naming.rebind(>' rmi://localhost:1900 '>+> >'/geeksforgeeks'>,obj);> >}> >catch>(Exception ae)> >{> >System.out.println(ae);> >}> >}> }>

>

>

6단계: 클라이언트 응용프로그램 생성 및 실행
마지막 단계는 클라이언트 응용 프로그램을 생성하고 이를 별도의 명령 프롬프트에서 실행하는 것입니다. Naming 클래스의 조회 메소드는 Stub 객체의 참조를 가져오는 데 사용됩니다.

자바




// Java program for client application> import> java.rmi.*;> public> class> ClientRequest> {> >public> static> void> main(String args[])> >{> >String answer,value=>'Reflection in Java'>;> >try> >{> >// lookup method to find reference of remote object> >Search access => >(Search)Naming.lookup(>' rmi://localhost:1900 '>+> >'/geeksforgeeks'>);> >answer = access.query(value);> >System.out.println(>'Article on '> + value +> >' '> + answer+>' at techcodeview.com'>);> >}> >catch>(Exception ae)> >{> >System.out.println(ae);> >}> >}> }>

>

>

메모: 위의 클라이언트와 서버 프로그램은 동일한 머신에서 실행되므로 localhost가 사용됩니다. 다른 컴퓨터에서 원격 개체에 액세스하려면 localhost를 원격 개체가 있는 IP 주소로 바꿔야 합니다.

클래스 이름에 따라 파일을 각각 저장하십시오.

Search.java, SearchQuery.java, SearchServer.java 및 ClientRequest.java
중요한 관찰:

  1. RMI는 원격 프로시저 호출(RPC)에 대한 순수 Java 솔루션이며 Java로 분산 애플리케이션을 만드는 데 사용됩니다.
  2. Stub 및 Skeleton 객체는 클라이언트와 서버 측 간의 통신에 사용됩니다.