RMI入门HelloWorld
java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用。PRC通信原理如图:

方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
package com.corearchi.rmi.api; import java.rmi.Remote;
import java.rmi.RemoteException; /**
* 远程接口HelloService
*
* @author DonnieGao
* @create 2018-01-29 上午10:14
**/
public interface HelloService extends Remote { /**
* 远程接口方法sayHello
*
* @param somebody 某个人
* @return 返回调用接口结果
* @throws RemoteException 抛出RemoteException异常
*/
String sayHello(String somebody) throws RemoteException;
}
远程接口实现:
package com.corearchi.rmi.impl; import com.corearchi.rmi.api.HelloService; import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; /**
* 远程接口HelloService的实现
*
* @author DonnieGao
* @create 2018-01-29 上午10:18
**/
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService{ /** 父类构造抛出异常,子类也需抛出异常 */
public HelloServiceImpl() throws RemoteException {
} /**
* 远程接口方法sayHello
*
* @param somebody 某个人
* @return 返回调用接口结果
* @throws RemoteException 抛出RemoteException异常
*/
@Override
public String sayHello(String somebody) throws RemoteException {
return "hello" + somebody;
}
}
客户端Server实现:
package com.corearchi.rmi.server; import com.corearchi.rmi.api.HelloService;
import com.corearchi.rmi.impl.HelloServiceImpl; import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; /**
* 远程Rmi服务端
*
* @author DonnieGao
* @create 2018-01-29 上午10:25
**/
public class HelloServer { public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
// 创建远程服务接口
HelloService helloService = new HelloServiceImpl(); // 注册服务
LocateRegistry.createRegistry(1234);
Naming.bind("rmi://localhost:1234/helloService",helloService); System.out.println("HelloServer has started and provide RPC service at the same time");
}
}
package com.corearchi.rmi.client; import com.corearchi.rmi.api.HelloService; import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; /**
* 远程连接的客户端
*
* @author DonnieGao
* @create 2018-01-29 上午10:29
**/
public class HelloClient { public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
// 引入远程服务
HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:1234/helloService"); // 调用远程方法
System.out.println("RMI服务器结果是 "+helloService.sayHello("Kitty"));
}
}
一个简单的RMI通信Demo就完成了,先运行Server,在运行Client。
RMI入门HelloWorld的更多相关文章
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- Java RMI 入门案例
Java Remote Method Invocation(Java RMI) 是一个 Java API, 执行远程方法的调用,相当于 Remote Procedure Calls(RPC).Java ...
- Wix学习整理(1)——快速入门HelloWorld
原文:Wix学习整理(1)--快速入门HelloWorld 1 Wix简介 Wix是Windows Installer XML的简称,其通过类XML文件格式来指定了用于创建Windows Instal ...
- CodeIgniter入门——HelloWorld
原文:CodeIgniter入门--HelloWorld CodeIgniter(CI)是一套给PHP网站开发者使用的应用程序开发框架和工具包. 初次接触,来一个HelloWorld~~~ ^_^ 准 ...
- Flask入门HelloWorld
Flask入门HelloWorld Flask官网:http://flask.pocoo.org/ Flask中文翻译:http://dormousehole.readthedocs.io/en/la ...
- java rmi 入门实例
java rmi 入门实例 (2009-06-16 16:07:55) 转载▼ 标签: java rmi 杂谈 分类: java-基础 java rmi即java远程接口调用,实现了2台虚拟机之 ...
- Windows Eclipse Scala的入门HelloWorld
[学习笔记] Windows Eclipse Scala的入门HelloWorld 有关带scala版本的eclipse4.7的下载, 你可以直接去: http://scala-ide.org/dow ...
- Springboot2.x入门——helloWorld
Springboot2.x入门--helloWorld 一.简介 1.1 Springboot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的 ...
- Java RMI之HelloWorld经典入门案例
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
随机推荐
- good pics
- 如何在两个月的时间内发表一篇EI/SCI论文-我的时间管理心得
在松松垮垮的三年研究生时期,要说有点像样的成果,也只有我的小论文可以谈谈了.可能有些厉害的角色研究生是丰富而多彩的,而大多数的同学在研究生阶段可能同我一样,是慢悠悠的渡过的,而且可能有的还不如我,我还 ...
- 百度地图隐藏LOGO显示
在引入地图的页面加入下列样式即可隐藏百度地图左下角的LOGO <style type="text/css"> .anchorBL{display:none;} ...
- PHP 获取数组随意下标key的上一个prev和下一个next下标值
PHP 获取数组随意下标key的上一个prev和下一个next下标值 <? php $xoops[1] = '小'; $xoops[2] = '孩'; $xoops[3] = '子'; $xoo ...
- android 智能提示
<AutoCompleteTextView android:id="@+id/autoCompleteTextView" android:completionThreshol ...
- 「CF375D Tree and Queries」
题目 \(dsu\ on\ tree\)的板子题了 \(dsu\ on\ tree\)本质上一种优秀通过轻重链剖分优化到\(O(nlogn)\)的暴力 一般用来解决没有修改的允许离线的子树查询问题 首 ...
- Avito Cool Challenge 2018 E. Missing Numbers 【枚举】
传送门:http://codeforces.com/contest/1081/problem/E E. Missing Numbers time limit per test 2 seconds me ...
- 第三章.搭建MyBatis工程环境
1.数据库的准备: 数据库: create DATABASE mybatis: 数据表: CREATE TABLE `user` ( `id` int(10) NOT NULL AUTO_INCREM ...
- @RequestParam和@PathVariable的区别及其应用场景
@RequestParam和@PathVariable这两者之间区别不大,主要是请求的URL不一样 用@RequestParam请求接口时,URL是:http://www.test.com/user/ ...
- Java构造器(构造方法)与方法区别
构造器,又称为构造方法.构造器用于构造该类的实例,也就是对象. 格式如下:[修饰符] 类名 (形参列表){//n条语句} 构造方法是一种特殊的方法,与一般的方法区别: 1.构造方法的名字必须与定义 ...