Java学习之路-RMI学习
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
一、创建RMI程序的4个步骤
1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。
2、定义一个实现该接口的类。
3、创建一个服务,用于发布2中定义的类。
4、创建一个客户程序进行RMI调用。
二、程序的详细实现
1.首先我们先创建一个实体类,这个类需要实现Serializable接口,用于信息的传输。
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.定义一个接口,这个接口需要继承Remote接口,这个接口中的方法必须声明RemoteException异常。
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
public interface StudentService extends Remote {
List<Student> getList() throws RemoteException;
}
3.创建一个类,并实现步骤2中的接口,但还需要继承UnicastRemoteObject类和显示写出无参的构造函数。
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
public class StudentServiceImpl extends UnicastRemoteObject implements
StudentService {
public StudentServiceImpl() throws RemoteException {
}
public List<Student> getList() throws RemoteException {
List<Student> list=new ArrayList<Student>();
Student s1=new Student();
s1.setName("张三");
s1.setAge(15);
Student s2=new Student();
s2.setName("李四");
s2.setAge(20);
list.add(s1);
list.add(s2);
return list;
}
}
4.创建服务并启动服务
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class SetService {
public static void main(String[] args) {
try {
StudentService studentService=new StudentServiceImpl();
LocateRegistry.createRegistry(5008);//定义端口号
Naming.rebind("rmi://127.0.0.1:5008/StudentService", studentService);
System.out.println("服务已启动");
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 创建一个客户程序进行RMI调用。
import java.rmi.Naming;
import java.util.List;
public class GetService {
public static void main(String[] args) {
try {
StudentService studentService=(StudentService) Naming.lookup("rmi://127.0.0.1:5008/StudentService");
List<Student> list = studentService.getList();
for (Student s : list) {
System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.控制台显示结果
=============控制台============
姓名:张三,年龄:15
姓名:李四,年龄:20
===============================
在Spring中配置Rmi服务
将Rmi和Spring结合起来用的话,比上面实现Rmi服务要方便的多。
1.首先我们定义接口,此时定义的接口不需要继承其他接口,只是一个普通的接口
package service;
import java.util.List;
public interface StudentService {
List<Student> getList();
}
2.定义一个类,实现这个接口,这个类也只需实现步骤一定义的接口,不需要额外的操作
package service;
import java.util.ArrayList;
import java.util.List;
public class StudentServiceImpl implements StudentService {
public List<Student> getList() {
List<Student> list=new ArrayList<Student>();
Student s1=new Student();
s1.setName("张三");
s1.setAge(15);
Student s2=new Student();
s2.setName("李四");
s2.setAge(20);
list.add(s1);
list.add(s2);
return list;
}
}
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.配置的东西就这么多,是不是比上面的现实要方便的多呀!现在我们来测试一下
package service;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
StudentService studentService=(StudentService) ctx.getBean("getStudentService");
List<Student> list = studentService.getList();
for (Student s : list) {
System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());
}
}
}
=============控制台============
姓名:张三,年龄:15
姓名:李四,年龄:20
=============================
上面的mian方法运行可能会报错,应该是spring的jar少了,自己注意添加。
第一次写博客,有不对的地方请多多指出。
Java学习之路-RMI学习的更多相关文章
- 《Hadoop学习之路》学习实践
(实践机器:blog-bench) 本文用作博文<Hadoop学习之路>实践过程中遇到的问题记录. 本文所学习的博文为博主“扎心了,老铁” 博文记录.参考链接https://www.cnb ...
- Java学习之路-Hessian学习
Hessian是基于HTTP的轻量级远程服务解决方案,Hessian像Rmi一样,使用二进制消息进行客户端和服务器端交互.但与其他二进制远程调用技术(例如Rmi)不同的是,它的二进制消息可以移植其他非 ...
- (转)java web 学习之路(学习顺序)
第一步:学习HTML和CSS HTML(超文本标记语言)是网页的核心,学好HTML是成为Web开发人员的基本条件.HTML很容易学习的,但也很容易误用,要学精还得费点功夫. 随着HTML5的发展和普及 ...
- Java学习之路-Burlap学习
今天我们来学一下Burlap. Burlap是一种基于XML远程调用技术,但与其他基于XML的远程技术(例如SOAP或者XML-RPC)不同,Burlap的消息结构尽可能的简单,不需要额外的外部定义语 ...
- 微软企业库5.0 学习之路——扩展学习篇、库中的依赖关系注入(重构 Microsoft Enterprise Library)[转]
这篇文章是我在patterns & practices看到的一篇有关EntLib5.0的文章,主要介绍了EntLib5.0的这次的架构变化由来,觉得很不错,大家可以看一下! 在过去几年中,依赖 ...
- 《Hadoop学习之路》学习实践二——配置idea远程调试hadoop
背景:在上篇文章中按照大神“扎心了老铁”的博客,在服务器上搭建了hadoop的伪分布式环境.大神的博客上是使用eclipse来调试,但是我入门以来一直用的是idea,eclipse已经不习惯,于是便摸 ...
- Linux学习之路--shell学习
shell基础知识 什么是Shell Shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作 ...
- Java程序员学习之路
1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...
- (转)如何学习Java技术?谈Java学习之路
51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...
随机推荐
- 在css中 父元素不固定高度,怎样实现子元素的高度100%
父元素使用 position: relative; 子元素使用 position: absolute; height: 100%;
- php安装xdebug后var_dump输出没有格式化的问题
开发环境,装了一个xdebug扩展方便调试代码. 但是环境配置好了之后却发现xdebug加载成功了但是var_dump输出的内容却没有使用html格式化 这时想到估计是php.ini里面的某个输出的配 ...
- OpenGL ES 系列教程
http://www.linuxgraphics.cn/graphics/opengles_tutorial_index.html 本文收集了一套 OpenGL ES 系列教程. www.play3d ...
- [原]F5负载均衡示例:轮寻
/** * lihaibo 欢迎转载,请保留原地址 */ 规划: F5 1600 BIG-IP 内网 192.168.100.0 255.255.255.0 外网 10.50.20.0 255.255 ...
- 替换Quartus 自带编辑器 (转COM张)
正文 此处以Quartus II 11.1和Notepad++ v5.9.6.2为例. 1. 使用QII自动调用Notepad++来打开HDL.sdc.txt等文件:并且可以在报错的时候,Notepa ...
- 简单ORM工具的设计和编写,自己项目中曾经用过的
http://www.cnblogs.com/szp1118/archive/2011/03/30/ORM.html 在之前的一个项目中自己编写了一个简单的ORM小工具,这次重新整理和重构了一下代码, ...
- mysql rowid实现
) a, b b表是数据表
- 【巷子】---json-server---基本使用
一.前后端并行开发的痛点 前端需要等待后端开发完接口以后 再根据接口来完成前端的业务逻辑 二.解决方法 在本地模拟后端接口用来测试前端效果 这种做法称之为构建前端Mock 三.json-serve ...
- logstash实战input插件syslog
vim /etc/logstash/conf.d/syslog.conf input{ syslog{ type => "system-syslog" port => ...
- 洛谷P2216 理想的正方形
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...