Java远程方法调用,即Java RMI(Java Remote Method Invocation)。一种用于实现远程过程调用的应用程序编程接口。客户机上运行的程序可以调用服务器上的对象。

缺点:只针对Java语言

client: stub
server: skeleton
client与server通过Socket进行双向数据传递。

序列化与反序列化,也叫做: 编码与解密
序列化:将对象转换成字节
反序列化:将字节转换成对象

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

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

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

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

4、创建一个客户端,进行RMI调用。

二、程序的实现

1、创建一个Student类。实现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、定义一个接口

public interface IStudentService extends Remote {
List<Student> getStudents() throws RemoteException;
}

  

3、创建一个实现类

public class StudentServiceImpl extends UnicastRemoteObject implements IStudentService {

    protected StudentServiceImpl() throws RemoteException {
} public List<Student> getStudents() throws RemoteException {
List<Student> students = new ArrayList<>();
for(int i = 1; i < 5; i++){
Student s = new Student();
s.setName("Nick" + i);
s.setAge(i + 20);
students.add(s);
}
return students;
}
}

  

4、启动服务

public class Start {
public static void main(String[] args) {
try {
IStudentService studentService = new StudentServiceImpl();
LocateRegistry.createRegistry(5000);
Naming.rebind("rmi://127.0.0.1:5000/IStudentService",studentService);
System.out.println("服务已经启动");
}catch (Exception e){
e.printStackTrace();
} }
}

  

5、客户端程序调用RMI方法

public class RmiClient {
public static void main(String[] args) {
try{
IStudentService studentService = (IStudentService) Naming.lookup("rmi://127.0.0.1:5000/IStudentService");
List<Student> students = studentService.getStudents();
for (Student s: students){
System.out.println("姓名:" + s.getName() + ",年龄:" + s.getAge());
}
}catch (Exception e){
e.printStackTrace();
} }
}

  显示结果

姓名:Nick1,年龄:21
姓名:Nick2,年龄:22
姓名:Nick3,年龄:23
姓名:Nick4,年龄:24

  

Java RMI实践的更多相关文章

  1. Exception thrown by the agent : java.rmi.server.ExportException: Port already in use

    今天有个应用一直起不来,感觉配置都对啊,奇了怪了.看日志发现如下: STATUS | wrapper | 2017/01/04 08:09:31 | Launching a JVM...INFO | ...

  2. Java RMI之HelloWorld篇

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  3. 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099;

     错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099; nested exception is:  java ...

  4. JAVA RMI 实例

    下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用. 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承Unicas ...

  5. JAVA RMI例子

    RMI 是java语言的一个RPC框架,本文给出基础例子如下: 1.实现接口: public interface ICalc extends Remote { public int add(int p ...

  6. java.rmi.NoSuchObjectException: no such object in table

    jmx链接的时候,最简单的例子都行不通,郁闷,出现了: 参考:http://reiz6153.blog.163.com/blog/static/401089152009442723208/ 代码: M ...

  7. 大型网站系统与Java中间件实践

    大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著   ISBN 978-7-121-22761-5 2014年4 ...

  8. 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误:

  9. Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例

    RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网 ...

随机推荐

  1. MySQL Index--InnoDB引擎的主键索引

    查看表主键信息 ## 查看表主键信息 SELECT t.TABLE_NAME, t.CONSTRAINT_TYPE, c.COLUMN_NAME, c.ORDINAL_POSITION FROM IN ...

  2. Python——循环语句

    while循环: 通常使用在当满足某一条件时进行的循环语句. 例如: while True: #当为True时进行循环,这个搭配就是死循环 print(1) while count < 10: ...

  3. 解决spring-test中Feign问题: No qualifying bean of type 'org.springframework.cloud.openfeign.FeignContext' available

    问题现象: 启动测试类(含通过Feign远程调用的组件),报错: No qualifying bean of type 'org.springframework.cloud.openfeign.Fei ...

  4. Graphviz install the Windows for Scyther

    1.在Pycharm 中使用Scyther工具的时候需要导入 graphviz 直接在 Interpreter 上安装的售后会报错,如果在 IDE上无法支架安装的库可以试图在控制台上安装,控制台上无法 ...

  5. POST请求接口实列

    通过响应状态来判断是否读取数据与抛出异常,然后通过判断获取的字节数去读取数据或抛出异常 /** * 发送HttpPost请求 * @param strURL * 服务地址 * @param param ...

  6. amazeui datepicker日历控件 设置默认当日

    amazeui datepicker日历控件 设置默认当日 背景: 最近在做一个系统的时候,前台需要选择日期,传给后台进行处理,每次都需要通过手动点击组件,选择日期,这样子很不好,所以我想通过程序自动 ...

  7. Python for Email

    SMTP 正如 HTTP 是计算机用来通过因特网发送网页的协议,简单邮件传输协议(SMTP) 是用于发送电子邮件的协议 import smtplib 发送电子邮件 连接到SMTP服务器 smtpObj ...

  8. yarn cluster和yarn client模式区别——yarn-cluster适用于生产环境,结果存HDFS;而yarn-client适用于交互和调试,也就是希望快速地看到application的输出

    Yarn-cluster VS Yarn-client 从广义上讲,yarn-cluster适用于生产环境:而yarn-client适用于交互和调试,也就是希望快速地看到application的输出. ...

  9. lomback插件在日志管理方面的应用

    由于现在使用日志可以省去在解决bug时候的很多麻烦, lomback为我们提供了很方便的打印日志的管理 @RunWith(SpringRunner.class) @SpringBootTest @Sl ...

  10. 07 c++中的内联函数inline

    文章链接: 问题描述:类中成员函数缺省默认是内联的,如果在类定义时就在类内给出函数定义,那当然最好.如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联 ...