ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] RMI example
    programing/Language 2018. 12. 1. 01:33

    안녕하세요, Einere입니다.

    (ADblock 꺼주시면 감사하겠습니다.)


    오늘은 java RMI example에 대해 포스팅하겠습니다.

    해당 포스트는 오직 컴파일과 실행을 목적으로 합니다.

    자세한 설명 및 원리는 따로 찾아보시길 바랍니다.

     

     

     

    Directory Structure

    프로젝트 디렉토리 구조는 위와 같습니다.

    즉, DesignPattern1/src/RMI/Hello에 모든 파일들이 존재합니다.

     

     

     

    Hello interface

    package RMI.Hello;  import java.rmi.Remote; import java.rmi.RemoteException;  public interface Hello extends Remote {     String sayHello() throws RemoteException; } 

    우선, 인터페이스를 정의합니다.

     

     

     

    Server class

    package RMI.Hello;  import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject;  public class Server implements Hello {     public Server(){}      public String sayHello() {         return "Hello, world!";     }      public static void main(String[] args) {         Server obj = new Server();         try {             Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);              // Bind the remote object's stub in the registry             Registry registry = LocateRegistry.getRegistry();             registry.bind("Hello", stub);             System.out.println("Server ready");         } catch (Exception e) {             System.out.println("Server exception: " + e.toString());         }     } } 

    서버 역할을 할 Server class를 구현합니다.

     

     

    여기서 sayHello()의 반환값이 한글로 되어 있다면, 위와 같이 컴파일 시에 인코딩 관련 오류를 마구마구 뱉어냅니다.

    참고로, microsoft에서 독자적으로 사용하는 한국어 인코딩이 CP949입니다..

     

     

     

    Client class

    package RMI.Hello;  import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry;  public class Client {     private Client() {     }      public static void main(String[] args) {         String host = (args.length < 1) ? null : args[0];          try {             Registry registry = LocateRegistry.getRegistry(host);             Hello stub = (Hello) registry.lookup("Hello");             String response = stub.sayHello();             System.out.println("response: " + response);         } catch (Exception e) {             System.err.println("Client exception: " + e.toString());             e.printStackTrace();         }     } } 

    클라이언트 역할을 할 Client class를 구현합니다.

    stub을 이용해 skeleton의 method를 실행하는 코드입니다.

     

     

     

    Compile

     

     

    터미널 혹은 콘솔에서 Hello.java, Server.java, Client.java가 존재하는 폴더(.../DesignPattern1/src/RMI/Hello/)로 이동합니다.

    그리고 "javac Hello.java Server.java Client.java"명령어를 이용해 컴파일합니다.

    컴파일 결과물로는 Hello.class, Server.class, Client.class파일이 생성됩니다.

    포스팅의 맨 위에 보시면 생성된 것을 확인할 수 있습니다.

     

     

     

    Run

     

    터미널에서 이제 디렉토리를 상위폴더(.../DesignPattern1/src)로 이동합니다.

    즉, 패키지인 RMI상위 폴더로 가면 됩니다.

     

    그리고 "start rmiregistry"를 입력하여 rmiregistry를 실행합니다.

    해당 레지스트리가 실행중이 아니라면 프로그램이 동작하지 않습니다.

     

    "java RMI.Hello.Server"를 입력하여 서버를 실행합니다.

    그러면 위와 같이 방화벽 경고가 뜨는데, 액세스 허용을 눌러줍니다.

    그러면 Server ready라는 문자열이 출력됩니다.

     

     

    이제 새로운 터미널을 새로 열어서 같은 경로(.../DesignPattern1/src)로 이동해줍니다.

    그리고 "java RMI.Hello.Client"를 입력하여 클라이언트를 실행합니다.

    그러면 response: Hello, World!라고 문자열이 출력됩니다.

     

    성공!

     

     

     

    댓글

Designed by black7375.