1. 处理过程中出现的问题
【现象】
启动RMI的Server端程序,报如下错误:
Caused by: java.lang.IllegalArgumentException: illegal remote method encountered: ...
at sun.rmi.server.Util.checkMethod(Util.java:244)
at sun.rmi.server.Util.getRemoteInterfaces(Util.java:223)
at sun.rmi.server.Util.getRemoteInterfaces(Util.java:193)
at sun.rmi.server.Util.createProxy(Util.java:126)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:179)
... 70 more
【解决】
RMI中的方法需要添加 “throws RemoteException”
【官方解释】
make sure you throw RemoteException in all methods that you expose.
http://www.coderanch.com/t/189384/Developer-Certification-SCJD/certification/RMI-client-failure
http://bach.yo2.cn/articles/%E8%AF%95%E7%94%A8rmi-plugin-for-eclipse.html
接口
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote{
public void run(String name) throws RemoteException ;
}
实现接口
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloI extends UnicastRemoteObject implements Hello {
private static final long serialVersionUID = 1L;
protected HelloI() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
public void run(String name) throws RemoteException{
// TODO Auto-generated method stub
System.out.println("hello"+name);
}
}
服务器
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class HelloServer {
public static void main(String args[]) throws Exception {
Hello hello=new HelloI();
LocateRegistry.createRegistry(8888);
Naming.bind("rmi://localhost:8888/RHello",hello);
System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
}
}
客户端
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class HelloRMIClient {
public static void main(String args[]){
try {
//在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
Hello rhello =(Hello) Naming.lookup("rmi://localhost:8888/RHello");
rhello.run("hello");
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
*参考资料*