Java RMIサーバーを作成する
RMI
JavaのRMI(Remote Method Invocation、リモートメソッド呼び出し)は、分散して存在するオブジェクト間のメッセージ送信(メソッド呼び出しを含む)を可能にするプロトコルである。
RMIを使用すると、とても簡単にサーバーを構築でき、Socketを意識する必要もない。
また、ローカルクラスを使用している場合とほとんど変わらずにサーバーへアクセスできる。
サーバーを起動するには、JAVA_HOME/jre/lib/security/java.policyにpermission 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();
}
}
}