공부/Object-Oriented Design Pattern

Java RMI (Remote Method Invocation) (2)

혼밥맨 2021. 4. 3. 11:29
반응형

Java RMI (Remote Method Invocation) (2) 

 

“Hello World” RMI Application

하나의 RMI Application을 작성 하기 위해서는 3개 정도의 Java Files이 필요 하다.
- 원격 인터페이스 : 자바 인터페이스
- 원격 인터페이스를 구현한 클래스 : 클래스
- RMI 서버 Application : 클래스
- RMI 클라이언트 Application : 클래스


““ Hello World ” – 원격 인터페이스 

원격 인터페이스는 원격 객체에 대하여 클라이언트가 호출 할 수 있는 비즈니스 메소드를 정의 한다.
클라이언트는 원격 인터페이스에서 정의된 메소드만 서로 다른 실행환경에서 원격으로 호출 할 수 있다.
이렇게 원격에서 호출 가능한 메소드를 “원격 메소드” 라고 한다.
Hello.java에서는 sayHello라는 원격 메소드를 정의 하고 있다.

1
2
3
4
// Hello.java
public interface Hello extends java.rmi.Remote {
    public String sayHello(String name) throws java.rmi.RemoteException;
}
cs

 

 

““Hello World” – 원격 인터페이스를 구현한 클래스 

HelloImpl.java는 원격 인터페이스 Hello를 구현 한 클래스이며 HelloImpl 클래스의 인스턴스가 원격객체로서 RMI 서버에 의해 이름으로 등록 된다.
“Hello World” Application 에서는 java.rmi.UnicastRemoteObject 를 상속하며 원격 이터페이스를 구현하고 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// HelloImpl.java
import java.rmi.server.*;
import java.rmi.*;
 
public class HelloImpl extends UnicastRemoteObject implements Hello {
    public HelloImpl() throws RemoteException {
        super();
    }
 
    //원격 메소드 구현
    public String sayHello(String name) {
        return "Hello World ... " + name + "!";
    }
}
cs



““ Hello World ” – RMI 서버 Application 

HelloServer.java의 경우 RMI 서버 Application의 기능만을 정의한 단순한 클래스 이다.
HelloImpl 객체를 생성하고 “HelloRemote”라는 이름으로 등록하며 이후 RMI 클라이언트에서의 메소드 호출을 기다린다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// HelloServer.java
public class HelloServer {
    public static void main(String[] args) {
        try {
            HelloImpl remoteObj = new HelloImpl();
            java.rmi.Naming.rebind("rmi://localhost:1099/HelloRemote", remoteObj);
            System.out.println("Hello Remote Object bound to the registry and ready to service incoming client calls...");
        } catch(java.rmi.RemoteException e) {
            System.err.println("Exception occurred during processing incoming method call");
        } catch(java.net.MalformedURLException e) {
            System.err.println("Check the url String...");
        }
    }
}
cs





““ Hello World ” – RMI 클라이언트 Application

RMI 서버 Applcation 에서 등록한 원격객체 “HelloRemote” 에 대한 reference를 얻고 있는 부분을 제외하면 실제 로컬의 런타임 환경에서 생성한 객체와 전혀 다를 바 없는 레퍼런스를 사용한 메소드 호출을 하고 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// HelloClient.java, 실행시 이름을 인자로...
import java.rmi.Naming;
 
public class HelloClient {
    public static void main(String[] args) {
        try {
            Object obj = Naming.lookup("rmi://localhost:1099/HelloRemote");
            Hello remoteObj = (Hello)obj;
            String msg = remoteObj.sayHello(args[0]);
            System.out.println(msg);
        } catch(java.rmi.RemoteException e) {
            System.out.println("Something has gone wrong during remote method call...");
        } catch(java.rmi.NotBoundException e) {
            System.out.println("Could't bound...");
        } catch(java.net.MalformedURLException e) {
            System.out.println("Check url stirng...");
        }
    }
}
cs






““ Hello World ” 실행 방법 

RMI 소스 파일을 컴파일 한다. 원격 인터페이스 구현 클래스에 대한 스텁 생성(JAVA_HOME/bin/rmic 사용)
- rmic HelloImpl

네이밍 서버 데몬 시작
rmiregistry 1099 & (Unix)
start rmiregistry 1099 (Windows)

RMI 서버 실행
- java HelloServer
RMI 클라이언트 실행
- java HelloClient jclee

 

 

 

 

출처 : ojc.asia/bbs/board.php?bo_table=LecJavaNet&wr_id=14

반응형