Java学习之路-RMI学习

王朝学院·作者佚名  2016-05-29
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

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

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 implements13 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 }

5. 创建一个客户程序进行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 }

6.控制台显示结果

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

姓名:张三,年龄: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少了,自己注意添加。

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航