远程通讯实例(RMI)

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();       
        }     
    }     
 }  

 

*参考资料*

http://yedehua.javaeye.com/blog/809891

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值