Java学习之路-RMI学习

  Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

  一、创建RMI程序的6个步骤

    1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。

    2、定义一个实现该接口的类。

    3、创建一个服务,用于发布2中定义的类。

    4、创建一个客户程序进行RMI调用。

  二、程序的详细实现

    1.首先我们先创建一个实体类,这个类需要实现Serializable接口,用于信息的传输。    

 1 import java.io.Serializable;
 3 public class Student implements Serializable {
 5   private String name;
 7   private int age;
 9   public String getName() {
11       return name;
13   }
15   public void setName(String name) {
17       this.name = name;
19   }
21   public int getAge() {
23       return age;
25   }
27   public void setAge(int age) {
29       this.age = age;
31   }
33 }

    2.定义一个接口,这个接口需要继承Remote接口,这个接口中的方法必须声明RemoteException异常。

 1 import java.rmi.Remote;
 3 import java.rmi.RemoteException;
 5 import java.util.List;
 6 public interface StudentService extends Remote {
12   List<Student> getList() throws RemoteException;
14 }

    3.创建一个类,并实现步骤2中的接口,但还需要继承UnicastRemoteObject类和显示写出无参的构造函数。

 1 import java.rmi.RemoteException;
 3 import java.rmi.server.UnicastRemoteObject;
 5 import java.util.ArrayList;
 7 import java.util.List;
11 public class StudentServiceImpl extends UnicastRemoteObject implements
13       StudentService {
15   public StudentServiceImpl() throws RemoteException {
17   }
21   public List<Student> getList() throws RemoteException {
23       List<Student> list=new ArrayList<Student>();
25       Student s1=new Student();
27       s1.setName("张三");
29       s1.setAge(15);
31       Student s2=new Student();
33       s2.setName("李四");
35       s2.setAge(20);
37       list.add(s1);
39       list.add(s2);
41       return list;
43   }
45 }

    4.创建服务并启动服务

 1 import java.rmi.Naming;
 2 import java.rmi.registry.LocateRegistry;
 4 public class SetService {
 6     public static void main(String[] args) {
 8         try {
10             StudentService studentService=new StudentServiceImpl();
12             LocateRegistry.createRegistry(5008);//定义端口号
14             Naming.rebind("rmi://127.0.0.1:5008/StudentService", studentService);
16             System.out.println("服务已启动");
18         } catch (Exception e) {
20             e.printStackTrace();
22         }
24     }
26 }

    4. 创建一个客户程序进行RMI调用。

 1 import java.rmi.Naming;
 3 import java.util.List;
 5 public class GetService {
 9   public static void main(String[] args) {
11       try {
13           StudentService studentService=(StudentService) Naming.lookup("rmi://127.0.0.1:5008/StudentService");
15           List<Student> list = studentService.getList();
17           for (Student s : list) {
19               System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());
21           }
23       } catch (Exception e) {
25           e.printStackTrace();
27       }
29   }
33 }

    5. 控制台显示结果

      =============控制台============

      姓名:张三,年龄:15

      姓名:李四,年龄:20

      ===============================

在Spring中配置Rmi服务

  将Rmi和Spring结合起来用的话,比上面实现Rmi服务要方便的多。

  1.首先我们定义接口,此时定义的接口不需要继承其他接口,只是一个普通的接口

1 package service;
3 import java.util.List;
5 public interface StudentService {
7      List<Student> getList();
9 }

  2.定义一个类,实现这个接口,这个类也只需实现步骤一定义的接口,不需要额外的操作

 1 package service;
 4 import java.util.ArrayList;
 6 import java.util.List;
 9 public class StudentServiceImpl implements StudentService {
11  public List<Student> getList() {
13   List<Student> list=new ArrayList<Student>();
15   Student s1=new Student();
17   s1.setName("张三");
19   s1.setAge(15);
21   Student s2=new Student();
23   s2.setName("李四");
25   s2.setAge(20);
27   list.add(s1);
29   list.add(s2);
31   return list;
33  }
35 }

  3.接一下来在applicationContext.xml配置需要的信息

    a.首先定义服务bean    

<bean id="studentService" class="service.StudentServiceImpl"></bean>

    b.定义导出服务

      <bean class="org.springframework.remoting.rmi.RmiServiceExporter"
        p:service-ref="studentService"
        p:serviceInterface="service.StudentService"
        p:serviceName="StudentService"
        p:registryPort="5008"
      />

      也可以增加p:registryHost属性设置主机

    c.在客户端的applicationContext.xml中定义得到服务的bean(这里的例子是把导出服务bean和客户端的bean放在一个applicationContext.xml中的)

 <bean id="getStudentService"
  class="org.springframework.remoting.rmi.RmiProxyFactoryBean"
  p:serviceUrl="rmi://127.0.0.1:5008/StudentService"
  p:serviceInterface="service.StudentService"
 />

    d.配置的东西就这么多,是不是比上面的现实要方便的多呀!现在我们来测试一下

 1 package service;
 2 import java.util.List;
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 public class Test {
 6 public static void main(String[] args) {
 7   ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
 8   StudentService studentService=(StudentService) ctx.getBean("getStudentService");
 9   List<Student> list = studentService.getList();
10   for (Student s : list) {
11    System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());
12   }
13  }
14 }

      =============控制台============
      姓名:张三,年龄:15
      姓名:李四,年龄:20
      =============================
      上面的mian方法运行可能会报错,应该是spring的jar少了,自己注意添加。

第一次写博客,有不对的地方请多多指出。

时间: 2024-10-01 07:47:35

Java学习之路-RMI学习的相关文章

Java学习之路-Hessian学习

Hessian是基于HTTP的轻量级远程服务解决方案,Hessian像Rmi一样,使用二进制消息进行客户端和服务器端交互.但与其他二进制远程调用技术(例如Rmi)不同的是,它的二进制消息可以移植其他非Java的语言中.  一.创建Hessian程序的4个步骤  1.定义一个远程接口的接口.  2.定义一个实现该接口的类.  3.在web.xml中定义导出Hessian服务需要的信息.  4.编写客户端访问代码.  二.程序的具体实现  一.首先我们先创建Web项目,并新建一个实体类,这个类需要实

前端小白的学习之路--HTML学习

HTML的补充学习 1. meta与base <meta http-equiv="refresh" content="2" > 2秒刷新一次 <base href="https://www.baidu.com" target="_blank"> 设置默认跳转地址以及跳转方式 <link rel="icon" sizes="any" mask href=&qu

VSTO学习之路:学习使用Epplus(1)

关于读取其它工作簿数据的几个方式的比较: 1.VBA的GetObject方法,会调用Excel程序打开工作簿(虽然不可见,但确实是打开的) 2.SQL,使用繁琐缺少灵活,不支持单元格样式的操作,也似乎不支持delete语句删除源数据. 3.使用Open XML SDK,基于Open XML,不依赖于Excel程序,但步骤繁琐. 4.Epplus,基于OpenXML,简单灵活,不依赖Excel程序打开工作簿,处理数据的速度快. 下载:Epplus,引用Epplus,然后  using Office

VSTO学习之路:学习使用Epplus——读写VBA代码

创建xlsm工作簿: 宏工作簿,必须有VBProject对象,至少要有一个工作表 1 string path = @"E:\studyvs\open xml\test.xlsm"; 2 var package = new ExcelPackage(); 3 package.Workbook.Worksheets.Add("Sheet1"); 4 //创建工程对象 5 package.Workbook.CreateVBAProject(); 6 //保存工作簿 7 p

Java程序员学习之路

1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基本没有其它任何一本书可以超越它.该书的作者Bruce Eckel在网络上被称为天才的投机者,作者的<Thinking in C++> 在1995年曾获SoftwareDevelopment Jolt Award最佳书籍大奖,<Thinking in Java>被评为1999年Java

Java学习之路(二)--Thinking in Java

针对昨天Java学习之路(一)--Thinking in Java中的类的静态方法不能访问创建非静态类,给出了将内部类修改成为static静态类,操作方便简单.现在给出第二种不需要添加删除的另一种极为高效的方式.可以将内部类从你所创建的类中复制粘贴到类外,作为一个外部类,在static主方法中就可以创建类的引用了. 源代码如下: ? class test{ int s; char c; } public class test1 { public static class test{ int s;

JAVA学习之路:不走弯路,就是捷径

转自:http://blog.csdn.net/jaketseng/archive/2007/12/01/1910483.aspx 软件开发之路是充满荆棘与挑战之路,也是充满希望之路.JAVA学习也是如此,没有捷径可走.梦想像<天龙八部>中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子功力,是很不现实的.每天仰天大叫"天神啊,请赐给我一本葵花宝典吧",殊不知即使你获得了葵花宝典,除了受自宫其身之苦外,你也不一定成得了" 东方不败",倒是成"西方失败&

Java学习之路:1、HelloWorld

似乎每种语言都是从HelloWorld开始的,所以,我的第一个java程序,也应该是这样开始的! 1.配置好jdk后,开始编写HelloWorld.java package second;//这个应该在我的理解就相当于php的命名空间 public class HelloWorld {//如同php中的声明一个类,不过php是不需要加public这样的类型修饰符 public static void main(String[] args){//声明一个方法,不过不懂的是为什么一定要static:

(转)如何学习Java技术?谈Java学习之路

51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领域其他技能的学习. [在原先<学好Java之我见>的基础上重新整理而成] Java - 近10年来计算机软件发展过程中的传奇,其在众多开发者心中的地位就如“屠龙刀”.“倚天剑”. Java是个平台,我只想说说我对学好Java的一点看法,希望对初学者有所帮助. 1. 思考一下 学习Java之前,先别