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命令。