Java의 원격 메소드 호출

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을 발생시키려면 기본 생성자를 생성해야 합니다.

자바




// 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 객체는 클라이언트와 서버 측 간의 통신에 사용됩니다.