Java RMI 서버 만들기

RMI

Java의 RMI(Remote Method Invocation, 원격 메소드 호출)은 분산되어 존재하는 객체 간의 메시지 전송(메소드를 호출하는 것 포함)을 가능하게 하는 프로토콜이다.
RMI을 사용하면 매우 간단하게 서버를 구축하는 것이 가능하고, Socket 를 의식할 필요도 없다.
그리고 로컬 클래스를 사용하고 있는 것과 변함없이 서버에의 액세스가 가능하다.

서버를 시작하려면 JAVA_HOME/jre/lib/security/java.policypermission java.security.AllPermission;를 추가해야 한다.

서버 인터페이스

package com.devkuma.basic.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RemoteServer extends Remote {
    boolean isAlive() throws RemoteException;
}

서버 구현 클래스

package com.devkuma.basic.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class RemoteServerImpl extends UnicastRemoteObject implements RemoteServer {

    public RemoteServerImpl(String name, int port) throws RemoteException {
        System.setSecurityManager(new SecurityManager());
        LocateRegistry.createRegistry(port);
        try {
            Naming.rebind(new StringBuffer(64).append("//:").append(port)
                    .append('/').append(name).toString(), this);
        } catch (MalformedURLException e) {
            throw new RemoteException(e.getMessage(), e);
        }
    }

    public boolean isAlive() throws RemoteException {
        return true;
    }

    public static void main(String[] args) {
        try {
            String serviceName = "devkuma";
            int port = 1234;
            new RemoteServerImpl(serviceName, port);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

클라이언트 클래스

package com.devkuma.basic.rmi;

import java.rmi.Naming;

public class RemoteServerClient {

    public static void main(String[] args) {
        try {
            RemoteServer server = (RemoteServer) Naming.lookup("rmi:/localhost:1234/devkuma");
            System.out.println(server.isAlive());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}