RMI(Remote Method Invocation,远程程序调用)。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/17ac93c324c669bfa6d98e966e500940.png)
源码准备
服务端
创建远程接口
//MyRemote.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MyRemote extends Remote{
public String sayHello() throws RemoteException;
}
创建远程接口MyRemote
。可以看到,远程接口MyRemote
继承自java.rmi.Remote
。
在远程接口MyRemote
中定义了客户端可以调用的远程方法sayHello
。
实现远程接口
// MyRemoteImpl.java
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.Naming;
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
public static void main(String[] args){
try {
MyRemote service = new MyRemoteImpl();
Naming.rebind("RemoteHello",service);
} catch (Exception e) {
e.printStackTrace();
}
}
public MyRemoteImpl() throws RemoteException{
}
@Override
public String sayHello(){
return "Server asys,'Hey'";
}
}
MyRemoteImpl
实现远程接口MyRemote
,就要实现远程接口中定义的方法sayHello
,这个方法会被客户端远程调用。
MyRemoteImpl
通过继承UnicastRemoteObject
成为一个远程服务类,通过new MyRemoteImpl()
来创建远程服务对象。
注意哈,UnicastRemoteObject
的构造函数会抛出RemoteException
异常,对此,MyRemoteImpl
也要声明一个构造函数并抛出RemoteException
异常。
通过Renaming.rebind("RemoteHello",service)
,RMI系统才会将我们创建的远程服务对象MyRemote service = new MyRemoteImpl()
注册到registry中,至此service
成为客户端服务设施,即sub
。
客户端
// MyRemoteClient.java
import java.rmi.Naming;
public class MyRemoteClient{
public static void main(String[] args){
new MyRemoteClient().go();
}
public void go(){
try{
MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/RemoteHello");
String s = service.sayHello();
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}
}
}
客户端通过Naming.lookup("rmi://127.0.0.1/RemoteHello")
查找名为RemoteHello
的远程服务对象,并调用该对象提供的方法sayHello
。
编译
在source目录下编译,javac -d ../classes *.java
执行rmic生成sub类
在classes目录下执行,rmic MyRemoteImple
,生成MyRemoteImpl_Stub.class
。
启动rmiregistry
在classes目录下执行,rmiregistry
启动远程服务
在classes目录下执行java MyRemoteImpl
,创建远程对象并注册服务,以供客户端查询该服务。
运行客户端
在classes目录下执行java MyRemoteClient
。