rmi demo:
1、server和client共用接口的包名要一致(全路径名)
public interface IHello extends Remote{
public String helloWord() throws RemoteException;
public String sayHello(String name) throws RemoteException;
}
2、server:继承UnicastRemoteObject,用于网络传输,生成存根、骨架等,实现IHello远程接口生命此类可以远程调用
public class HelloImpl extends UnicastRemoteObject implements IHello{
private static final long serialVersionUID = 1L;
protected HelloImpl() throws RemoteException {
}
@Override
public String helloWord() throws RemoteException {
return "hello";
}
@Override
public String sayHello(String name) throws RemoteException {
return "hello,"+name;
}
}
启动类:使用两种方式
public class HelloServer {
public static void main(String[] args) {
init();
}
public static void init(){
try {
IHello hello = new HelloImpl();//创建远程对象
/*//本地主机上的远程对象注册表实例,如果缺少注册表的创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(8089);//用于远程查找
//把远程对象注册到RMI注册服务上,并命名为Rhello
Naming.bind("rmi://192.168.40.69:8089/Rhello", hello);*/
Context context = new InitialContext();
LocateRegistry.createRegistry(8089);
context.rebind("rmi://127.0.0.1:8089/Rhello", hello);
System.out.println("remote object bind successfully!!");
} catch (RemoteException e) {
e.printStackTrace();
}/* catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
} */catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、client:
public class HelloClient {
public static void main(String[] args) {
callHello();
}
public static void callHello(){
//在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
try {
IHello hello = (IHello) Naming.lookup("rmi://192.168.40.69:8089/Rhello");//存根,代理类
System.out.println("存根class:"+hello.getClass());
System.out.println(hello.helloWord());
System.out.println(hello.sayHello("张三"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}