1.RMI远程调用:

  • Remote Method Invocation
  • 目的:把一个接口方法暴露给远程

示例:

定义一个接口Clock,它有一个方法能够获取当前的时间,并编写一个实现类,来实现这个接口。

RMI远程调用示例:

public interface Clock{
//获取当前时间
//LocalDateTime currentTime();
}
public class ClockImpl implements Clock{
public LocalDateTime currentTime() throws RemoteException{
return LocalDateTime.now();
}
}

服务器端:

    //创建一个Clock接口的实例
Clock impl = new ClockImpl();
//通过UnicastRemoteObject.exportObject把这个实例和端口暴露到网络上
Clock stub = (Clock) UnicastRemoteObject.exportObject(impl, 1099);
//打开1099的端口
LocalRegistry.createRegistry(1099);
//创建LocalRegistry.getRegistry()创建Registry实例
Registry registry = LocalRegistry.getRegistry();
//将远程调用对象stub绑定到registry,并命名为Clock。这里的名称和客户端查找的名称是一样的
registry.bind("Clock", stub);

客户端:

    //获取远程Clock示例:通过registry.lookup(服务名称)获得一个Clock接口的引用
Cllock clock = (Clock) registry.lookup("Clock");
//正常方法调用
LocalDateTime dt = clock.currentTime();

在一个RMI远程调用中,客户端持有的是Clock引用,它只想的真正对象是有JVM帮我们创建的ClockClientStub类,而Server端我们创建的是Clock接口和ClockImpl实现类,JVM同样会创建一个类似于ClockServerStub的包装类型,然后通过网络,简介实现远程调用。

Clock.java

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.time.LocalDateTime; public interface Clock extends Remote { //远程接口必须继承至Remote接口
LocalDateTime currentTime() throws RemoteException;//每个接口方法也要抛出RemoteException
}

ClockImpl.java

import java.rmi.RemoteException;
import java.time.LocalDateTime; public class ClockImpl implements Clock{
@Override
public LocalDateTime currentTime() throws RemoteException{
return LocalDateTime.now();
}
}

ClockServer.java

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject; public class ClockServer {
public static void main(String[] args) throws Exception{
Clock impl = new ClockImpl(); //创建ClockImpl的实例,它是真正用于调用业务的方法
Clock stub = (Clock) UnicastRemoteObject.exportObject(impl,1099);//传入实例、端口,输出为一个stub对象
LocateRegistry.createRegistry(1099); //在1099端口创建一个LocateRegistry对象
Registry registry = LocateRegistry.getRegistry(); //获取这个LocateRegistry对象
registry.bind("Clock",stub); //把stub这个实例绑定到Clock这个名字上
System.out.println("Clock server ready");
}
}

ClockClient.java

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.time.LocalDateTime; public class ClockClient {
public static void main(String[] args) throws Exception{
Registry registry = LocateRegistry.getRegistry(); //不传或传入null,代表远程地址是localhost,获得Registry对象
Clock clock = (Clock) registry.lookup("Clock"); //获得远程对象的引用
LocalDateTime dt = clock.currentTime(); //对这个远程对象,正常调用它的方法
System.out.println("RMI result:"+dt);
}
}

2.总结

  • RMI远程调用是针对Java语言的一种远程调用
  • 远程接口必须继承至Remote
  • 远程方法必须抛出RemoteException
  • 客户端调用RMI方法和调用本地方法类似
  • RMI方法调用被自动通过网络传输到服务器端
  • 服务器端通过自动生成的stub类接收远程调用请求。

廖雪峰Java13网络编程-3其他-2RMI远程调用的更多相关文章

  1. 廖雪峰Java13网络编程-1Socket编程-2TCP编程

    1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据 ...

  2. 廖雪峰Java13网络编程-1Socket编程-5UDP编程

    1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr ...

  3. 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

  4. 廖雪峰Java13网络编程-1Socket编程-1网络编程概念

    1.计算机网络 1.1 什么是计算机网络? 两台或更多计算机组成的网络 同一网络内的任意2台计算机都可以直接通信 所有计算机必须遵循同一种网络协议 1.2 什么是互联网 互联网是网络的网络 互联网采用 ...

  5. 廖雪峰Java13网络编程-3其他-1HTTP编程

    1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...

  6. 廖雪峰Java13网络编程-2Email编程-2接收Email

    1接收Email协议类型 接收Email:收件人通过MUA软件把邮件从MDA抓取到本地计算机的过程. 1.1 POP3 从MUA到MDA使用最广泛的是协议是POP3 Post Office Proto ...

  7. 廖雪峰Java13网络编程-2Email编程-1发送email

    1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件 ...

  8. 廖雪峰Java6 IO编程-2input和output-4Filter模式

    1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...

  9. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

随机推荐

  1. 使用Docker创建数据容器

    使用Docker创建数据容器 翻译自: Data-only container madness 1.什么是数据容器? 数据容器就是本身只创建一个volume供其他容器共享,创建完后即退出,不执行任何任 ...

  2. LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)

    题目标签:Math 题目让我们判断机器人是否是一直在走一个圈. 当我们把 instructions 走完一遍时候: 1. 如果机器人回到了原点,那么它是在走一个圈. 2. 如果机器人的方向没有改变,那 ...

  3. jquery操作html元素之( 获得内容和属性)

    * jQuery - 获得内容和属性 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力. jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变 ...

  4. 从虚拟地址,到物理地址(开PAE)

    学了好久好久,但是好久好久都没有用过,今天突然要用,都快忘了怎么玩了, 这里记录一下吧. 如何检测PAE r cr4 第5位如果是1,则开了PAE,否则没开 切入目标进程 查找一个自己关注的字符串s ...

  5. JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  6. VGDB提示

    由于之前地址的版本在未安装.Net 4.0的电脑上安装会出现插件使用装载失败的问题,已更新,新地址为:http://pan.baidu.com/s/1xdnuD,此版本需要.Net 2.0.

  7. 用于扩展目标跟踪的笛卡尔B-Spline车辆模型

    (哥廷根大学) 摘要 文章提出了一种表示空间扩展物体轮廓的新方法,该方法适用于采用激光雷达跟踪未知尺寸和方向的车辆.我们在笛卡尔坐标系中使用二次均匀周期的B-Splines直接表示目标的星 - 凸形状 ...

  8. 使用FastJson转化Json格式

    1.下载Jar包 http://repo1.maven.org/maven2/com/alibaba/fastjson/ 2.将jar包导入工程 3.示例 package nc.testFastJso ...

  9. java String,StringBuilder和StringBuffer类的区别

    对String而言: String是只读字符串,所引用的字符串不能被改变,一经定义,无法再增删改. String 定义的字符串保存在常量池里面,进行+操作时不能直接在原有基础上拼接. 每次+操作 : ...

  10. SpringCloudBus

    不重启微服务的情况下更新配置 配置服务端 tensquare_config配置依赖 <dependency> <groupId>org.springframework.clou ...