RMI(Remote Method Invocation ) 概念恢复
1、RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法。
2、EMI术语
在研究代码之前,我们来看看必须编写哪些代码:
远程对象:这个接口只定义了一个方法,我们应当明白的是,这个接口可以既包含方法的代码也包含方法的定义。远程对象包含要导出的每个方法的定义,并且实现Java.RMI中的远程接口。
远程对象实现:这是一个实现远程对象的类。如果实现了远程对象,就能够覆盖该对象中的所有方法,因此,远程对象的实现类将真正包含我们希望=导出的方法代码。
远程服务器:这是一个作为服务器使用的类,它是相对要远程访问方法的客户端而言的。它储存着绑定的字符串和对象。
远程客户端:这是一个帮助我们访问远程方法提供帮助的类,它也是最终用户。
Stub(存根)和Skeleton(骨架)
Stub和Skeleton是经过RMIC命令生成的,我们的程序要通过远程调用,底层一定是套接字的字节传输,传输到服务器或者客户端的对端后,再把该对象反序列化为对应的对象,这些网络传输的过程要求安全、稳定等等非常麻烦的操作,Stub驻留客户端,承担着代理远程对象的实现者的角色,Skeleton类帮助远程对象与Stub在RMI连接上进行通信。RMI的客户与STUB进行交换,STUB与SKELETON通信,SKELETON负责与服务器进行交互,因此有了STUB和SKELETON之后我们就不要需要实现底层通信的细节,我们进行的远程调用,只需要通过接口对方法进行操作即可,使分布式调用实现了位置上的透明,即:远程调用就像本地调用一样。
服务器端实现
1.服务接口
/**
*服务接口
*定义了行为集
*/
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote { /**
* 在服务器打印客户端发过来的message 并返回“Hello World”字符串
*/
public String sayHello(String message) throws RemoteException;
}
2.服务实现
/**
*服务实现
*继承UnicastRemoteObject
*/
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class HelloImpl extends UnicastRemoteObject implements IHello { //必须的
public HelloImpl() throws RemoteException {
super();
} @Override
public String sayHello(String message) {
System.out.println("================client message" + message);
return "Hello World!";
} }
3.启动RMI服务器并暴露服务
/**
*RMI服务器
*1、创建一个服务
*2、启动服务器
*3、注册服务
*/
import java.rmi.registry.*;
import java.rmi.*;
import java.rmi.server.*; public class HelloServer { public static void main(String[] args) throws Exception { //
IHello hello = new HelloImpl(); //2启动服务器 启动一个注册表并把注册表绑定到一个端口(默认端口1099)
LocateRegistry.createRegistry(8888);
//3将服务注册到注册表 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
Naming.bind("rmi://localhost:8888/hello", hello); System.out.println("========服务器启动了"); } }
客户端实现
1.服务接口
/**
*服务接口
*定义了行为集
*/
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote { /**
* 在服务器打印客户端发过来的message 并返回“Hello World”字符串
*/
public String sayHello(String message) throws RemoteException;
}
2.客户端实现
/**
* 1、服务实现者是谁? 服务器
* 2、如何获取服务 查找
* 3、如何调用服务接口
*/
import java.rmi.*;
public class HelloClient { public static void main(String[] args) throws Exception { //1、查找服务
IHello hello = (IHello)Naming.lookup("rmi://localhost:8888/hello"); System.out.println(Naming.lookup("rmi://localhost:8888/hello"));
//2、调用
System.out.println(hello.sayHello("haha")); }
}
RMI(Remote Method Invocation ) 概念恢复的更多相关文章
- K:java中的RMI(Remote Method Invocation)
相关介绍: RMI全称是Remote Method Invocation,即远程方法调用.它是一种计算机之间利用远程对象互相调用,从而实现双方通讯的一种通讯机制.使用这种机制,某一台计算机(虚拟机) ...
- Spring Remoting: Remote Method Invocation (RMI)--转
原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...
- java的RMI(Remote Method Invocation)
RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络 ...
- Spring之RMI 远程方法调用 (Remote Method Invocation)
RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...
- Java远程方法调用(Remote Method Invocation,RMI)
Java RMI简介: 它是Java的一个核心API和类库,允许一个Java虚拟机上运行的Java程序调用不同虚拟机上运行的对象中的方法,即使这两个虚拟机运行于物理隔离的不同主机上. Java RMI ...
- 【杂谈】对RMI(Remote Method Invoke)的认识
前言 对RMI接触的也比较早,基本上刚学完Java基础不久就机缘巧合遇到了.当时有尝试着去了解,但是没看到比较好的教程,而且对网络编程相关知识不太了解,看了不少文章,也没弄明白.现在对网络和I/O有了 ...
- Method Invocation Expressions
15.12.1. Compile-Time Step 1: Determine Class or Interface to Search The first step in processin ...
- bubbo调用Failed to invoke remote method异常解决
bubbo调用服务异常: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getPlanFlowInfo, pr ...
- com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method解决方法
报错日记: Caused by: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getUserAuthLeve ...
随机推荐
- 【Python学习笔记】多版本python使用pip安装第三方库
不知道是不是有人跟我一样,一直Python2与Python3混着用,然而在cmd中默认的Python版本只有一种,使用 pip install xxx(第三方库名) 只会安装到默认版本上. 而如果需 ...
- 限制printk打印频率函数printk_ratelimit【转】
转自:http://blog.csdn.net/lkkey80/article/details/45190095 版权声明:博文地址 http://blog.csdn.net/lkkey80?view ...
- GCC在C语言中内嵌汇编 asm __volatile__ 【转】
转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...
- 004_ssh连接慢的问题的解决?
<1>群中同学遇到的问题,我之前在uuwatch也遇到了同样的问题? 问个问题师兄们 突然之间 公司服务器连接很慢 连一个shell需要10几秒钟 服务器就在公司全是内网服务器, 我也不知 ...
- [New learn]GCD的卡死现象分析研究
https://github.com/xufeng79x/GCDDemo 1.简介 前接[New learn]GCD的基本使用,我们分析了GCD的一般使用方法,其中比较特殊的是在分析到主队列的时候发生 ...
- spring mvc注解文件上传下载
需要两个包: 包如何导入就不介绍了,前端代码如下(一定要加enctype="multipart/form-data"让服务器知道是文件上传): <form action=&q ...
- three.js、webGL、canvas区别于关联
canvas是html5新定义的一个标签,用于做图形容器 webgl要依赖canvas运行. three.js是以webgl为基础的库,封装了一些3D渲染需求中重要的工具方法与渲染循环.
- servlet学习记录:Servlet中的service()方法
Servlet的生存时间是由init,service,destory方法构成,这里分析一下service这个方法 Servlet接口中定义了一个service()方法,而我们一般是使用HttpServ ...
- VS Code js编译支持alias
VS Code 的编译器 其实就是使用的 typescript 编译器,就是以前提到过的 tsserver.js 相应的编译参数可以参考 http://www.typescriptlang.org/d ...
- vue2.0项目结构和打包发布
先来一张项目结构图: 本地开发测试运行的命令是npm run dev 打包发布的命令是 npm run build生成的dist文件夹里的文件就是我们可以布置到服务上的文件 但是呢,这打包好的文件的文 ...