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 ...
随机推荐
- arpspoof dnsspoof中间人攻击
最近搞了一个监听神器,尽管使用了网卡混杂模式,不过监听到的几乎全是本地流量, 为了获取更多有用的数据,搞一下中间人攻击,最基本的就是arpspoof + IP转发,这样就可以获得局域网内任何人的上网流 ...
- python urllib2练习发送简单post
import urllib2 import urllib url = 'http://localhost/1.php' while True: data = raw_input('(ctrl+c ex ...
- mysql查询语句的执行顺序(重点)
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
- python基础===创建大量对象是节省内存方法
问题: 你的程序要创建大量(可能上百万) 的对象,导致占用很大的内存. 解决方案: 对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例所占的内存.比如: ...
- linux===进程操作
ps -ef ps -aux|grep chat.js a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分 kill -9 nohup python da.py & ...
- 【python】pymongo中正则查询时的转义问题
在查询mongo时用到了正则查询 设字符串为 str = '/ab/cd.ef?g=' 直接用正则查询没有匹配. collection.find({"re":{'$regex' ...
- Mybatis学习—XML映射文件
总结自 Mybatis官方中文文档 Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同 ...
- jboss和tomcat有什么不同
2.tomcat 是 JSP/Servlet 容器jboss 是 JEE 容器,JEE 包括JSP/Servlet,JMS, EJB,JAX-WS,JAX-RS,CDI等等, tomcat是完全开源, ...
- 自动化运维之saltstack的使用安装
SaltStack 简介 SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块 ...
- JAVA用POI读取和创建2003和2007版本Excel
1.添加maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-o ...