RMI
来源:互联网 发布:tf卡数据恢复软件 编辑:程序博客网 时间:2024/06/12 01:47
RMI推荐博客:
http://haolloyin.blog.51cto.com/1177454/332426/
1.定义接口,继承Remote。在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。JavaDoc描述:Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用。
注意:extends了Remote接口的类或者其他接口中的方法若是声明抛出了RemoteException异常,则表明该方法可被客户端远程访问调用。
public interface PersonService extends Remote{ //远程调用的接口 public List<PersonEntity> GetList() throws RemoteException;}
2.远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根”,而服务器端本身已存在的远程对象则称之为“骨架”。其实此时的存根是客户端的一个代理,用于与服务器端的通信,而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。
/* * 接口的实现类,UnicastRemoteObject用于导出的远程对象和获得与该远程对象通信的存根。 */public class PersonServiceImpl extends UnicastRemoteObject implements PersonService { private static final long serialVersionUID = 4881868462165416802L; public PersonServiceImpl() throws RemoteException { super(); // TODO Auto-generated constructor stub } @Override public List<PersonEntity> GetList() throws RemoteException { // TODO Auto-generated method stub System.out.println("Get Person Start!"); List<PersonEntity> personList = new LinkedList<PersonEntity>(); PersonEntity person1 = new PersonEntity(); person1.setAge(25); person1.setId(0); person1.setName("Leslie"); personList.add(person1); PersonEntity person2 = new PersonEntity(); person2.setAge(25); person2.setId(1); person2.setName("Rose"); personList.add(person2); return personList; }}
3.
/* * 服务端,(注册服务,供客户端调用) */public class Program { public static void main(String[] args) { try { //继承Remote的远程对象 PersonService personService = new PersonServiceImpl(); //注册通讯端口 LocateRegistry.createRegistry(6600); //注册通讯路径 // 参数1.String—使用 URL 格式(不含 scheme 组件) 参数2.Remote—obj将与名称关联的新远程对象 Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService); System.out.println("Service Start!"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
4.客户端
/* * 客户端,调用服务 */public class Program { public static void main(String[] args) { try { /*调用远程对象,注意RMI路径与接口必须与服务器配置一致 * lookup:返回与指定 name 关联的远程对象的引用 * 参数name: 使用 URL 格式(不含 scheme 组件)的名称 */ PersonService personService = (PersonService) Naming.lookup("rmi://127.0.0.1:6600/PersonService"); List<PersonEntity> personList = personService.GetList(); for (PersonEntity person : personList) { System.out.println("ID:" + person.getId() + " Age:" + person.getAge() + " Name:" + person.getName()); } } catch (Exception ex) { ex.printStackTrace(); } }}
保存几张运行原理的图:
阅读全文
0 0
- RMI
- rmi
- RMI
- RMI
- RMI
- RMI
- rmi
- RMI
- RMI
- RMI
- RMI
- RMI
- rmi
- RMI
- RMI
- RMI
- RMI
- RMI
- 如何在css中设置半透明边框
- Android 面试题 关于数组排序问题
- git使用异常——git push --tags
- Maximum Binary Tree
- windows32位安装Tensorflow
- RMI
- linux下移植AM335的sgx驱动
- 机器学习实战:基于概率论的分类方法:朴素贝叶斯(源码解析,错误分析)
- 删除重复元素 drop_duplicates()
- Windows Server 2008 R2配置.Net环境
- 朴素贝叶斯分类(Naive Bayesian classification)及其python实现
- 动态select表达式(EF+Dto)
- memcache--定义from wiki
- 教师岗前培训心得体会