1. 程式人生 > >Java RMI 簡明教程

Java RMI 簡明教程

1、寫介面:

package rmi.server;

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

public interface MyRemote extends Remote {
	
	String doSomeThingA() throws RemoteException;
	
	String doSomeThingB() throws RemoteException;

}

2、寫實現類:

package rmi.server;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
	
	private static final long serialVersionUID = 1L;
	
	private String string;
	
	public MyRemoteImpl() throws RemoteException {
		string = "" + System.currentTimeMillis();
	}

	@Override
	public String doSomeThingA() {
		return "A:" + string;
	}

	@Override
	public String doSomeThingB() {
		return "B:" + string;
	}
	
	public static void main(String[] args) throws Exception {
		MyRemote myRemote = new MyRemoteImpl();
		Naming.bind("myRemote", myRemote);
	}

}

3、生成stub
在命令列進入class檔案所在的根目錄,比如我機器上的對應目錄是:
D:\workspace\youbang\rmi_server\build\classes
注意,要進入根包所在目錄,而不是進入MyRemoteImpl.class所在的目錄。
在這個目錄下執行命令:

rmic rmi.server.MyRemoteImpl

進入目錄D:\workspace\youbang\rmi_server\build\classes\rmi\server,會發現多出一個.class檔案:MyRemoteImpl_Stub.class

4、執行註冊命令(目錄不變)

rmiregistry

5、執行rmi.server.MyRemoteImpl:

java rmi.server.MyRemoteImpl

這樣,RMI的服務端就執行起來了。

6、寫一個客戶端程式呼叫一下試試:

package rmi.server;

import java.rmi.Naming;

public class Test {

	public static void main(String[] args) throws Exception {
		MyRemote myRemote = (MyRemote) Naming.lookup("rmi://127.0.0.1/myRemote");
		System.out.println(myRemote.doSomeThingA());
		System.out.println(myRemote.doSomeThingB());
	}

}

執行結果:
A:1547025085428
B:1547025085428

寫在末尾:
值得一提的是,MyRemote.java類中所有方法的引數和返回值要麼是原始型別,要麼是可序列化型別。另外,在執行MyRemoteImpl之前,要先執行rmiregistry命令。