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
'공부 > Object-Oriented Design Pattern' 카테고리의 다른 글
Java Socket Test Example (1) 자바 소켓 예시 (0) | 2021.04.03 |
---|---|
Java RMI (Remote Method Invocation) (3) (1) | 2021.04.03 |
Java RMI (Remote Method Invocation)을 알아보자 (0) | 2021.04.03 |
[OODP] Singleton Pattern (싱글톤 패턴) (0) | 2021.04.01 |
[OODP] Strategy Pattern (전략 패턴) (0) | 2021.03.28 |
댓글