`
saviorzuo
  • 浏览: 19877 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java分布式之RMI实例教程

阅读更多
前言
   最近的联通项目,下一阶段可能会涉及到和各省间的RMI接口,所以总结一下08年中国移动自动拨测系统用到的RMI技术,以备不时之需。同时也给广大初哥提供一些学习资料,哈哈。前几年,一直忙于项目,没怎么做系统总结。以后计划写一些以前项目用过的Java分布式技术实例教程,如:RMI、 Socket、Mina、SNMP、SOAP、Web Service、Hessian、JMS等。希望和大家一起交流,分享经验,一起提高。

RMI简介
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。
RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。看看jboss-remoting:


基本原理
   要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

主要步骤
  分为以下几个步骤:
1. 创建远程接口及声明远程方法(RmiMonitorService.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(RmiMonitorServiceImpl.java)
3. 启动RMI注册服务,并注册远程对象(RmiServer.java)
4. 客户端查找远程对象,并调用远程方法(MonitorClient.java)
5. 运行实例

业务场景
在移动拨测系统管理端中要融合实时显示。简单点说就是设备出现告警时,要采用不同方式实时展示。如Web界面(Ajax)、GIS等。

   主要业务流程设计:
1. 设备告警
2. 调用RMI Client
3. 调用RMI Server
4. 调用业务处理接口
5. 告警信息入库
6. 实时显示(Ajax,Gis等技术)


技术设计
接口函数函数名称: int interactive( int funindex, string param )
参数说明:
funindex 功能号,整型。1为设备告警
param 交互参数,字符串型。
返回:
成功=1,失败=0。
说明:
param交互参数用键值对组成,每个键值对以“&”分割,如:Tsid=01&devid=002&warnid=102&warntype=01&warnlevel=1 。
测试点ID(tsid)
设备ID(devid)
告警ID(warnid)
告警类型(warntype)
告警级别(warnlevel)

代码实现
废话少说,上代码,为了演示方便,经过整理,省去了很多get,set之类的东东还有业务的东西以及Spring相关的东西。

    RmiMonitorService.java  
 package nbpt.ts.manager.message.service;  
   
 import java.rmi.Remote;  
 import java.rmi.RemoteException;  
   
 /** 
  * Description: 实时显示RMI服务接口. 
  *  
  * RMI接口必须扩展接口java.rmi.Remote 
  *  
  * @author Peter Wei 
  * @version 1.0 Feb 25, 2009 
  */  
 public interface RmiMonitorService extends Remote {  
     /** 
      * 实时显示对外接口 
      *  
      * @param funindex 
      *            功能号 
      * @param param 
      *            键名列表,也就是实际传输的内容 
      * @return 
      * @throws RemoteException 
      *             远程接口方法必须抛出java.rmi.RemoteException 
      */  
     public int interactive(int funindex, String param) throws RemoteException;  
 }  
 RmiMonitorServiceImpl.java  
 package nbpt.ts.manager.message.service.impl;  
   
 import java.rmi.RemoteException;  
 import java.rmi.server.UnicastRemoteObject;  
 // import nbpt.ts.manager.base.util.AppContext;  
 import nbpt.ts.manager.message.service.RmiMonitorService;  
 import nbpt.ts.manager.message.service.WarnService;  
 /** 
  * Description: 实时显示RMI接口实现. 
  *  
  * 实现RMI接口及远程方法(继承UnicastRemoteObject) 
  *  
  * @author Peter Wei 
  * @version 1.0 Feb 25, 2009 
  */  
 public class RmiMonitorServiceImpl extends UnicastRemoteObject implements  
         RmiMonitorService {  
   
     private static final long serialVersionUID = -3771656108378649574L;  
   
     public static final int SUCCSS = 1;  
   
     public static final int FAIL = 0;  
   
     public WarnService warnService;  
   
     /** 
      * 必须定义构造方法,因为要抛出RemoteException异常 
      *  
      * @throws RemoteException 
      */  
     public RmiMonitorServiceImpl() throws RemoteException {  
         super();  
     }  
   
     public int interactive(int funindex, String param) throws RemoteException {  
   
         int result = FAIL;  
         switch (funindex) {  
         // 告警  
         case (1): {  
   
             // warnService = (WarnService) AppContext.getAppContext().getBean(  
             // "warn.warnService");  
             // 实际应用是从Spring应用中获取告警Service,如上代码  
             warnService = new WarnServiceImpl();  
             // 网络告警的业务操作  
             warnService.dealWarn(param);  
             result = SUCCSS;  
         }  
             break;  
         case (2):  
             // do other biz  
             break;  
         }  
         // ......  
   
         return result;  
     }  
   
     public WarnService getWarnService() {  
         return warnService;  
     }  
   
     public void setWarnService(WarnService warnService) {  
         this.warnService = warnService;  
     }  
   
 }  
   
 RmiServer.java  
 package nbpt.ts.manager.message.service;  
   
 import java.net.MalformedURLException;  
 import java.rmi.AlreadyBoundException;  
 import java.rmi.Naming;  
 import java.rmi.RemoteException;  
 import java.rmi.registry.LocateRegistry;  
 import nbpt.ts.manager.message.service.impl.RmiMonitorServiceImpl;  
 /** 
  * Description: RMI服务端. 
  *  
  * @author Peter Wei 
  * @version 1.0 Feb 25, 2009 
  */  
 public class RmiServer {  
   
     public String ip = "localhost";  
   
     public int port = 8889;  
   
     /** 
      * 启动RMI注册服务,并注册远程对象.实际应用中是在Spring初始化并启动 
      */  
     public void init() {  
         try {  
             LocateRegistry.createRegistry(port);  
             // 创建一个远程对象  
             RmiMonitorService comm = new RmiMonitorServiceImpl();  
             Naming.bind("//" + ip + ":" + port + "/comm", comm);  
         } catch (RemoteException e) {  
             System.out.println("创建远程对象发生异常!" + e.toString());  
             e.printStackTrace();  
         } catch (AlreadyBoundException e) {  
             System.out.println("发生重复绑定对象异常!" + e.toString());  
             e.printStackTrace();  
         } catch (MalformedURLException e) {  
             System.out.println("发生URL畸形异常!" + e.toString());  
             e.printStackTrace();  
         }  
     }  
   
     public String getIp() {  
         return ip;  
     }  
   
     public void setIp(String ip) {  
         this.ip = ip;  
     }  
   
     public int getPort() {  
         return port;  
     }  
   
     public void setPort(int port) {  
         this.port = port;  
     }  
   
     public static void main(String[] args) {  
         // 实际应用中是在Spring初始化并启动  
         RmiServer rmiServer = new RmiServer();  
         System.out.println("RMI服务初始化:");  
         rmiServer.init();  
   
     }  
 }  
 MonitorClient.java  
 package nbpt.ts.manager.message.service;  
   
 import java.net.MalformedURLException;  
 import java.rmi.Naming;  
 import java.rmi.NotBoundException;  
 import java.rmi.RemoteException;  
 /** 
  * Description: RMI客户端. 
  *  
  * @author Peter Wei 
  * @version 1.0 Feb 25, 2009 
  */  
 public class MonitorClient {  
   
     public RmiMonitorService monitorService;  
   
     public String ip = "localhost";  
   
     public int port = 8889;  
   
     public int interactive(int funindex, String param) {  
         int result = 0;  
         try {  
             getMonitorService().interactive(funindex, param);  
             result = 1;  
         } catch (RemoteException e) {  
             e.printStackTrace();  
         }  
         return result;  
     }  
   
     public RmiMonitorService getMonitorService() {  
         try {  
             // 在RMI服务注册表中查找名称为RmiMonitorService的对象,并调用其上的方法  
             monitorService = (RmiMonitorService) Naming.lookup("rmi://" + ip  
                     + ":" + port + "/comm");  
   
         } catch (NotBoundException e) {  
             e.printStackTrace();  
         } catch (MalformedURLException e) {  
             e.printStackTrace();  
         } catch (RemoteException e) {  
             e.printStackTrace();  
         }  
         return monitorService;  
     }  
   
     public static void main(String args[]) throws RemoteException {  
         MonitorClient client = new MonitorClient();  
         System.out.println("发送告警信息:");  
         String msg = "tsid=1022&devid=10001027&warnid=102&warntype=01&warnlevel=1&warnmsg=设备出错,请检查.";  
         System.out.println(client.getValue(msg, "warnmsg"));  
         client.interactive(1, msg);  
   
     }  
   
     public String getValue(String content, String key) {  
         String value = "";  
   
         int begin = 0, end = 0;  
         begin = content.indexOf(key + "=");  
         end = content.indexOf("&", begin);  
   
         if (end == -1)  
             end = content.length();  
         value = content.substring(begin + key.length() + 1, end);  
         return value;  
   
     }  
 }  
   
 WarnService.java  
 package nbpt.ts.manager.message.service;  
   
 /** 
  * Description: 告警服务 
  *  
  * @author Peter Wei 
  * @version 1.0 2010-8-22 
  */  
 public interface WarnService {  
   
     /** 
      * 处理告警:告警来时的业务操作,实际操作是解析消息存库,然后界面Ajax定时刷新数据,获取实时告警展示 
      *  
      * @param message 
      * @return 
      */  
     public int dealWarn(String message);  
 }  
 WarnServiceImpl.java  
 package nbpt.ts.manager.message.service.impl;  
   
 import nbpt.ts.manager.message.service.WarnService;  
   
 /** 
  * Description: 告警服务 
  *  
  * @author Peter Wei 
  * @version 1.0 2010-8-22 
  */  
 public class WarnServiceImpl implements WarnService {  
   
     public int dealWarn(String message) {  
         // 告警处理方法  
         System.out.println("已接收网络告警");  
 // …  
         return 1;  
     }  
   
 }  
分享到:
评论

相关推荐

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    JAVA分布式之RMI实例教程网络通信原理[收集].pdf

    JAVA中最简单的分布式调用RMI共12页.pdf.zip

    Java中的远程方法调用(Remote Method Invocation,简称RMI)是一种强大的技术,它允许Java对象在不同的Java虚拟机(JVM)之间进行交互,从而实现分布式计算。在本压缩包中,"JAVA中最简单的分布式调用RMI共12页.pdf...

    java_rmi.rar_RMI java_java.rmi

    这个"java_rmi.rar"压缩包包含的资源可能是一个Java RMI的实例教程或者代码示例。"www.pudn.com.txt"可能是一个包含相关说明或者下载链接的文本文件,而"rmi"可能是包含具体RMI示例代码的文件夹。 在RMI的基本流程...

    Rmi.rar_Java RMI_RMI java_java RMI 线程_rmi

    这个教程“Rmi.rar”显然包含了关于如何使用Java RMI实现不同方式的实例,这些实例可能是精心设计和测试的,旨在帮助学习者深入理解RMI的工作原理。 RMI的核心概念包括: 1. **远程接口(Remote Interface)**:...

    rmi.rar_Java RMI_RMI java_RMI policy.all_rmi

    RMI是Java在分布式计算领域的核心特性之一,极大地简化了网络应用的开发。 在“rmi.rar”这个压缩包中,我们可以找到与Java RMI相关的资料,可能包括示例代码、配置文件等。描述中提到的"java rmi例子"表明其中可能...

    java_in_rmi.rar_Java RMI_RMI java_rmi _精通rmi

    Java Remote Method Invocation(RMI)是Java平台中用于构建分布式应用程序的一种关键技术。它允许Java对象在不同的Java虚拟机(JVM)之间进行交互,仿佛它们都在同一台机器上运行。这个"java_in_rmi.rar"压缩包包含...

    分布式java应用完整版

    在这个资源包中,"更多北风网精品视频教程下载.html"和"E书家精品电子书下载.html"可能提供了丰富的视频教学和电子书资源,帮助学习者通过实例操作和理论结合的方式,更深入地理解和掌握分布式Java应用的相关技术。...

    RMI教程-入门经典

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的Java虚拟机之间进行通信,仿佛这些对象都在同一台机器上。RMI是构建分布式应用程序的关键组件,...

    liaotianshi.rar_RMI聊天室_java 网络_rmi _rmi 聊天_网络聊天室

    RMI是Java平台提供的一种分布式计算机制,允许在不同的Java虚拟机之间透明地调用对象的方法,即使这些对象位于不同的网络节点上。 **RMI原理:** RMI的核心思想是将对象的实例化和方法调用过程解耦,使得远程对象...

    基于RMI分布计算实例

    Java RMI(Remote Method Invocation,远程方法调用)是一种Java技术,它允许对象在不同的Java虚拟机(JVMs)之间进行通信,从而实现分布式计算。这种技术在开发跨网络的分布式应用程序时非常有用,因为它使得对象...

    分布式JAVA应用 基础与实践

    1. RMI(Remote Method Invocation):Java的远程方法调用机制,允许一个Java对象调用位于不同JVM上的另一个对象的方法,是Java分布式计算的基础。 2. EJB(Enterprise JavaBeans):面向企业级应用的组件模型,提供...

    网络编程入门rmi初级教程

    RMI是Java的特性之一,它使得Java应用程序能够透明地调用远程对象的方法,就像调用本地对象一样。这种能力对于构建分布式系统非常有用,因为它可以跨越网络边界,使不同的组件可以协同工作。RMI的核心概念包括:远程...

    RMI教程(PPT)

    3. **RMI的类包**:RMI包含多个相关的Java包,如`java.rmi`提供了RMI的核心API,`java.rmi.activation`用于激活对象,`java.rmi.dgc`涉及分布式垃圾收集,`java.rmi.registry`是RMI网络命名服务的API,`java.rmi....

    3-Java-RMI.rar_Durham

    Java RMI(Remote Method Invocation)是Java平台中用于构建分布式应用程序的一种关键技术。...通过Durham大学的这个教程,学习者将能够深入了解Java RMI的原理和实践,从而在设计和实现分布式系统时更加得心应手。

    rmi.rar_Java CORBA_corba_rmi

    Java RMI(Remote Method Invocation)和CORBA(Common Object Request Broker Architecture)是两种在分布式环境中实现对象间通信的重要技术。本教程将详细讲解这两个概念及其应用。 首先,让我们了解一下RMI。RMI...

    rmi个人心得及sun官方教程

    远程方法调用(RMI,Remote Method Invocation)是Java平台上的一个重要特性,它允许一个对象在不同的...通过阅读《RMI心得》和官方教程,你可以更深入地理解和运用这一强大的特性,提高你的Java分布式应用开发能力。

    SSD8 Java RMI and HTTP

    - **Java RMI 入门.doc**:适合初学者的RMI教程,可能包括基本概念、示例和实践指导。 - **Key Differences between HTTP1.0 and HTTP1.1.mht**:这个文件详细列出了HTTP1.0和HTTP1.1之间的关键差异。 - **Getting...

    Java RMI Tutorial.pdf

    ### Java RMI (Remote Method Invocation) 教程详解 #### 一、Java RMI 概述 Java Remote Method Invocation(RMI)是一种机制,它允许一个Java虚拟机(JVM)中的对象调用另一个JVM中的对象的方法。这种远程方法调用...

Global site tag (gtag.js) - Google Analytics