1 编写服务端
服务端工程是RmiServer,接口如下,注意两点,一个是一定要继承Remote的父类,另外是远程调用的方法一定要抛出RemoteException的异常。
package cn.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ITimeServer extends Remote{
public long getServerTime() throws RemoteException ;
}
服务端的实现类实现ITimeServer接口,并继承UnicastRemoteObject的父类,有两点要注意,一个是要有显示的构造方法并抛出RemoteException 异常,另外一个是远程调用的方法要抛出RemoteException 异常。
package cn.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ITimeServerImpl extends UnicastRemoteObject implements ITimeServer {
private static final long serialVersionUID = 8221409097017900253L;
protected ITimeServerImpl() throws RemoteException {
super();
}
@Override
public long getServerTime() throws RemoteException {
return System.currentTimeMillis();
}
}
要生成远程调用的class,进入cmd命令,进入该class的目录下,输入rmic 命令即可
可以看到生成stub的class,这个是远程的class
编写服务启动程序
package cn.server;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class StartServer {
public static void main(String[] args) {
try {
//start rmiregistry
ITimeServerImpl timeServer=new ITimeServerImpl();
Naming.rebind("rmi://localhost:1099/timeServer", timeServer);
System.out.print("Ready");
} catch (Exception e) {
e.printStackTrace();
}
}
}
启动注册注册表服务,默认是1099端口,如果不启动注册表服务,上面的mian运行会报错。
运行服务端的main方法,该服务运行成功。
如果不想用命令的方式启动注册表服务,需要在main方法加入LocateRegistry.createRegistry(1099);这句话会动态启动注册表服务。
编写客户端RmiClient工程,注意接口一定要和服务端的接口在同一个包下面,同样的接口名
package cn.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ITimeServer extends Remote{
public long getServerTime() throws RemoteException ;
}
客户端调用远程服务端的方法
package cn.client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import cn.server.ITimeServer;
public class Client {
public static void main(String[] args) {
ITimeServer iTimeServer;
try {
iTimeServer = (ITimeServer) Naming.lookup("rmi://localhost:1099/timeServer");
System.out.println(iTimeServer.getServerTime());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
该地址,是服务端注册的地址。
运行该程序,结果如下。