---恢复内容开始---

RMI已经不是什么新的技术了,但是相对于webservice来说,rmi比较简单,比较适合一些小的应用,下面的helloword列子可以介绍rmi的相关技术

服务器端代码:

  服务器接口实现Remote

  1. package com.qcf.server;
  2.  
  3. import java.rmi.Remote;
  4. import java.rmi.RemoteException;
  5. /**
  6. * 服务类
  7. * 定义行为集
  8. * @author Administrator
  9. *
  10. */
  11. public interface IHello extends Remote {
  12.  
  13. //在服务器端打印客户端传过来的字符串并返回该字符串
  14. public String sayHello(String str) throws RemoteException;
  15. }

  接口的实现类

  1. package com.qcf.server;
  2.  
  3. import java.rmi.RemoteException;
  4. import java.rmi.server.UnicastRemoteObject;
  5.  
  6. /**
  7. * 服务器端实现类
  8. * 需要继承UnicastRemoteObject
  9. * @author Administrator
  10. *
  11. */
  12. public class IHelloImpl extends UnicastRemoteObject implements IHello{
  13.  
  14. //必须的
  15. protected IHelloImpl() throws RemoteException {
  16. super();
  17. }
  18.  
  19. @Override
  20. public String sayHello(String str) throws RemoteException {
  21. System.out.println("客户端传过来的字符串是:" + str);
  22. return str;
  23. }
  24.  
  25. }

  服务类启动服务类

  1. package com.qcf.server;
  2.  
  3. import java.net.MalformedURLException;
  4. import java.rmi.AlreadyBoundException;
  5. import java.rmi.Naming;
  6. import java.rmi.RemoteException;
  7. import java.rmi.registry.LocateRegistry;
  8.  
  9. /**
  10. * RMI服务器
  11. * 1、创建一个服务
  12. * 2、启动服务器
  13. * 3、注册服务
  14. * @author Administrator
  15. *
  16. */
  17. public class HelloServer {
  18.  
  19. public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
  20. //1、创建一个服务
  21. IHello iHello=new IHelloImpl();
  22. //2、启动服务器 启动一个注册表并把注册表绑定到一个端口(默认端口1099)
  23. LocateRegistry.createRegistry(8189);
  24.  
  25. //3将服务注册到注册表 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
  26. Naming.bind("rmi://localhost:8189/ihello", iHello);
  27. System.out.println("server start success!");
  28. }
  29. }

  客户端类

    创建接口类如上

    客户端测试类

  1. package com.qcf.client;
  2.  
  3. import java.net.MalformedURLException;
  4. import java.rmi.Naming;
  5. import java.rmi.NotBoundException;
  6. import java.rmi.RemoteException;
  7.  
  8. /**
  9. * 客户端测试类
  10. * 服务器是谁 服务器
  11. * 如何获取服务 查找
  12. * 调用接口
  13. * @author Administrator
  14. *
  15. */
  16. public class HelloClient {
  17. public static void main(String[] args) throws Exception, Exception, Exception {
  18. //查找服务
  19. IHello hello=(IHello) Naming.lookup("rmi://localhost:8489/ihello");
  20. //调用接口
  21. String str=hello.sayHello("哈哈哈 。我测试成功了");
  22. System.out.println("客户端"+str);
  23. }
  24. }
运行RMI服务端程序:
 
运行RMI客户端程序:
 
 
总结:
从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。
这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。

---恢复内容结束---

远程调用之RMI技术的更多相关文章

  1. Atitit.分布式远程调用  rpc  rmi  CORBA的关系

    Atitit.分布式远程调用  rpc  rmi  CORBA的关系 1. 远程调用(包括rpc,rmi,rest)1 2. 分布式调用大体上就分为两类,RPC式的,REST式的1 3. RPC(远程 ...

  2. 远程调用之RMI、Hessian、Burlap、Httpinvoker、WebService的比较

    一.综述 本文比较了RMI.Hessian.Burlap.Httpinvoker.WebService5这种通讯协议的在不同的数据结构和不同数据量时的传输性能. RMI是java语言本身提供的远程通讯 ...

  3. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  4. 架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)

    在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调 ...

  5. alibaba远程调用框架dubbo原理

    alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...

  6. 使用C#跨PC 远程调用程序并显示UI界面

    在项目中有一个需求是需要在局域网内跨PC远程调用一个程序,并且要求有界面显示,调查了一些资料,能实现远程调用的.Net技术大概有PsExec.WMI.Schedule Task. 这三种方式都做了一个 ...

  7. Spring远程调用技术<1>-RMI

    在java中,我们有多种可以使用的远程调用技术 1.远程方法调用(remote method invocation, RMI)  适用场景:不考虑网络限制时(例如防火墙),访问/发布基于java的服务 ...

  8. Spring远程调用技术<2>-Hessian和Burlap

    上篇谈到RMI技术,加上Spring的封装,用起来很方便,但也有一些限制 这里的Hessian和Burlap解决了上篇提到的限制,因为他们是基于http的轻量级远程服务. Hessian,和RMI一样 ...

  9. Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

    转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如: ...

随机推荐

  1. VS2012 安装出错 :通道正在关闭

    从微软官网下的安装包iso,解压后安装时总是出现 3个错误,提示什么管道正在关闭,看了很多解决办法,挑了一个简单的:安装包有问题,重新下载一个,就好了(持续更新....)

  2. hibernate在地图的方法之一协会

    [Hibernate]之关于多对一单向关联映射 在项目的开发中多对一的单向关联映射是最常见的关联映射! 这个着重具体解说一下! 比如,我们如今一个组(Group)和人(Person) id name ...

  3. 模拟Vue之数据驱动3

    一.前言 在"模拟Vue之数据驱动2"中,我们实现了个Observer构造函数,通过它可以达到监听已有数据data中的所有属性. 但,倘若我们想在某个对象中,新增某个属性呢? 如下 ...

  4. 基于docker构建jenkins和svn服务(转)

    码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有. jenkins可能很多人都不了解.这是一个持续集成的工具,在敏捷开发领域很流行:跟svn结合可以实现定期build.check ...

  5. JavaScript语言基础知识7

    JavaScript该阵列是一个新概念. 我们可以使用newkeyword和Array()构造函数来解释 排列: <HTML> <HEAD> <TITLE>Hell ...

  6. HTTP 请求报文 响应报文(转)

    引言 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发 ...

  7. C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】

    STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...

  8. Ubuntu14.04 工作区设置

    记ubuntu您可以切换工作区,但我按住 Ctrl+Alt+方向键 交换器,有没有反应,在这样的使用切换啊. 原来Ubuntu14.04默认并没有开启,仅仅须要设置一下就OK了. 1.打开系统设置.外 ...

  9. MTK6572横屏的调试过程

    电视剧集:系统MTK缺省的系统源代码,Phone模式.底部有三个虚拟按键.需求为,设置成默认横屏,设定一个合理的虚拟按键方案. ------------------------------------ ...

  10. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...