Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java RMI(원격 메소드 호출)로 원격 메소드를 통해 데이터를 주고받는 방법

RMI는 원격 메소드 호출(Remote Method Invocation)의 약자입니다. 한 시스템(JVM)에 존재하는 객체가 다른 JVM에서 실행 중인 객체에 접근하거나 그 메소드를 호출할 수 있게 해주는 메커니즘입니다.

RMI는 분산 애플리케이션을 구축하는 데 사용되며, Java 프로그램 간의 원격 통신을 제공합니다. 관련 기능은 java.rmi 패키지에 포함되어 있습니다.

RMI 기반 Java 애플리케이션을 작성하려면 아래 단계를 순서대로 따라야 합니다.

1단계 - 원격 인터페이스 정의하기

원격 인터페이스는 특정 원격 객체가 제공하는 모든 메소드의 명세를 담고 있습니다. 클라이언트는 이 원격 인터페이스를 통해 서버와 통신합니다. 따라서 미리 정의된 인터페이스인 java.rmi.Remote를 상속(extends)하는 인터페이스를 생성해야 합니다.

예제

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
    void printMsg() throws RemoteException;
}

2단계 - 구현 클래스(원격 객체) 개발하기

이전 단계에서 생성한 원격 인터페이스를 구현해야 합니다. 구현 클래스를 별도로 작성할 수도 있고, 서버 프로그램이 직접 이 인터페이스를 구현하도록 만들 수도 있습니다. 즉, 원격 인터페이스의 모든 추상 메소드에 대한 실제 구현을 제공하면 됩니다.

예제

public class ImplExample implements Hello {
    public void printMsg() {
        System.out.println("This is an example RMI program");
    }
}

3단계 - 서버 프로그램 개발하기

RMI 서버 프로그램은 원격 인터페이스를 구현하거나 구현 클래스를 상속해야 합니다. 여기서는 원격 객체를 생성한 뒤 RMI 레지스트리(RMIregistry)에 바인딩(bind)해야 합니다. 다음과 같이 서버 프로그램을 작성합니다.

예제

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Server extends ImplExample {
    public Server() {}
    public static void main(String args[]) {
        try {
            ImplExample obj = new ImplExample();
            Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
            Registry registry = LocateRegistry.getRegistry();
            registry.bind("Hello", stub);
            System.err.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}

4단계 - 클라이언트 프로그램 개발하기

클라이언트 프로그램에서는 원격 객체를 가져온(fetch) 후, 해당 객체를 사용하여 필요한 메소드를 호출합니다.

예제

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
    private Client() {}
    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.getRegistry(null);
            Hello stub = (Hello) registry.lookup("Hello");
            stub.printMsg();
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }
}

5단계 - 애플리케이션 컴파일하기

애플리케이션을 컴파일하려면 다음 항목들을 각각 컴파일해야 합니다.

  • 원격 인터페이스 컴파일

  • 구현 클래스 컴파일

  • 서버 프로그램 컴파일

  • 클라이언트 프로그램 컴파일

6단계 - 애플리케이션 실행하기

  • 다음 명령어로 rmi 레지스트리를 시작합니다.

Start rmiregistry

        이 명령을 실행하면 별도의 창에서 rmi 레지스트리가 시작됩니다.

  • 아래와 같이 서버 클래스 파일을 실행합니다.

  • 아래와 같이 클라이언트 클래스 파일을 실행합니다.

  • 결과 확인 - 클라이언트를 시작하는 즉시 서버 쪽에서 다음과 같은 출력 결과를 확인할 수 있습니다.