본문 바로가기
공부/Object-Oriented Design Pattern

Java RMI (Remote Method Invocation) (2)

by 혼밥맨 2021. 4. 3.
반응형

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

반응형

댓글