Java学习之路-RMI学习

Wendy ·
更新时间:2024-11-11
· 603 次阅读

  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 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 }   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少了,自己注意添加。



java学习 java学 JAVA rmi

需要 登录 后方可回复, 如果你还没有账号请 注册新账号