廖雪峰Java13网络编程-3其他-2RMI远程调用
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远程调用的更多相关文章
- 廖雪峰Java13网络编程-1Socket编程-2TCP编程
		
1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据 ...
 - 廖雪峰Java13网络编程-1Socket编程-5UDP编程
		
1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr ...
 - 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程
		
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...
 - 廖雪峰Java13网络编程-1Socket编程-1网络编程概念
		
1.计算机网络 1.1 什么是计算机网络? 两台或更多计算机组成的网络 同一网络内的任意2台计算机都可以直接通信 所有计算机必须遵循同一种网络协议 1.2 什么是互联网 互联网是网络的网络 互联网采用 ...
 - 廖雪峰Java13网络编程-3其他-1HTTP编程
		
1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...
 - 廖雪峰Java13网络编程-2Email编程-2接收Email
		
1接收Email协议类型 接收Email:收件人通过MUA软件把邮件从MDA抓取到本地计算机的过程. 1.1 POP3 从MUA到MDA使用最广泛的是协议是POP3 Post Office Proto ...
 - 廖雪峰Java13网络编程-2Email编程-1发送email
		
1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件 ...
 - 廖雪峰Java6 IO编程-2input和output-4Filter模式
		
1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...
 - 廖雪峰Java2面向对象编程-4抽象类和接口-2接口
		
1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...
 
随机推荐
- 7、postman的变量
			
环境变量 环境变量顾名思义,我们可以设置测试环境和生产环境的变量. 比如我们设置测试环境的某个变量值为A,但是生产环境的为B,这个时候就可以用到环境变量.当然我们也可以不用环境变量,直接手动改,不过试 ...
 - js实现下拉框
			
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - 重启集群的时候发现HBase的HRegionServer 服务启动失败
			
今天在测试环境下的集群重启了下,启动Hbase的时候报错: $ sh start-hbase.sh starting master, logging to /home/hadoop/hbase-0.9 ...
 - Spring Cloud Eureka 注册安全一定要做到位!
			
/eureka/ 参考配置如下: defaultZone: http://javastack:javastack@eureka1:8761/eureka/, http://javastack:java ...
 - 17-Ubuntu-文件和目录命令-切换目录-相对路径和绝对路径
			
1.相对路径: 在输入路径时,最前面不是/或者~,表示相对当前目录所在的目录位置. 例:当前桌面目录下,通过相对路径切换到桌面目录下的Entertainment目录 2.绝对路径: 在输入路径时,最前 ...
 - USACO 2003 Fall Orange Popular Cows /// tarjan缩点 oj22833
			
题目大意: n头牛,m个崇拜关系,并且崇拜具有传递性 如果a崇拜b,b崇拜c,则a崇拜c 求最后有几头牛被所有牛崇拜 强连通分量内任意两点都能互达 所以只要强联通分量内有一点是 那么其它点也都会是 按 ...
 - Spring MVC @RequestMapping注解详解(2)
			
@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...
 - vue echart例——柱状图及高度自适应
			
1.安装 npm install echarts -s 2.例——点击tab切换时柱状图重绘,高度根据返回数据设置. <template> <div> <ul id=&q ...
 - 《移山之道》第十一章:两人合作  读书笔记 PB16110698 第六周(~4.15)
			
本周在考虑阅读材料时,我翻阅了<移山之道>,正好看到这一章:两人合作,心想:正好,我们正值结对作业的紧要关头,书中两人合作的宝贵经验和教诲应当对我们有很大帮助.于是,我开始一边在ddl苦 ...
 - JavaScript - 判断当前使用的浏览器类型
			
<script> window.onload = function() { // 判断当前使用的浏览器类型 var browserType = navigator.userAgent.to ...