stub 和 skeleton 的讲解,自己实现一个stub和skeleton程序

RMI的本质就是实现在不同JVM之间的调用,它的实现方法就是在两个JVM中各开一个Stub和Skeleton,二者通过socket通信来实现参数和返回值的传递。

     有关RMI的例子代码网上可以找到不少,但绝大部分都是通过extend the interface java.rmi.Remote实现,已经封装的很完善了,不免使人有雾里看花的感觉。下面的例子是我在《Enterprise JavaBeans》里看到的,虽然很粗糙,但很直观,利于很快了解它的工作原理。

Ⅰ:RMI工作原理(自定义实现一个Stub 和 Skeleton)

1. 定义一个Person的接口,其中有两个business method, getAge() 和getName()

Person代码:

 

  1. public interface Person {      
  2.     public int getAge() throws Throwable;      
  3.     public String getName() throws Throwable;      
  4. }

 

 

2. Person的实现PersonServer类

PersonServer代码:

 

  1. public class PersonServer implements Person {      
  2.     private int age;      
  3.     private String name;      
  4.     public PersonServer(String name, int age) {      
  5.         this.age = age;      
  6.         this.name = name;      
  7.     }      
  8.     public int getAge() {      
  9.         return age;      
  10.     }      
  11.     public String getName() {      
  12.         return name;      
  13.     }      
  14. }     

 

3. 好,我们现在要在Client机器上调用getAge()和getName()这两个business method,那么就得编写相应的Stub(Client端)和Skeleton(Server端)程序。这是Stub的实现:

Person_Stub代码:

//存根(stub)Person_Stub的实现:

 

  1. import java.io.ObjectOutputStream;      
  2. import java.io.ObjectInputStream;      
  3. import java.net.Socket;      
  4. public class Person_Stub implements Person {      
  5.     private Socket socket;      
  6.     public Person_Stub() throws Throwable {      
  7.         // connect to skeleton      
  8.         socket = new Socket("computer_name", 9000);      
  9.     }      
  10.     public int getAge() throws Throwable {      
  11.         // pass method name to skeleton      
  12.         ObjectOutputStream outStream =      
  13.             new ObjectOutputStream(socket.getOutputStream());      
  14.         outStream.writeObject("age");      
  15.         outStream.flush();      
  16.         ObjectInputStream inStream =      
  17.             new ObjectInputStream(socket.getInputStream());      
  18.         return inStream.readInt();      
  19.     }      
  20.     public String getName() throws Throwable {      
  21.         // pass method name to skeleton      
  22.         ObjectOutputStream outStream =      
  23.             new ObjectOutputStream(socket.getOutputStream());      
  24.         outStream.writeObject("name");      
  25.         outStream.flush();      
  26.         ObjectInputStream inStream =      
  27.             new ObjectInputStream(socket.getInputStream());      
  28.         return (String)inStream.readObject();      
  29.     }      
  30. }     

 

注意,Person_Stub和PersonServer一样,都implements Person。它们都实现了getAge()和getName()两个business method,不同的是PersonServer是真的实现,Person_Stub是建立socket连接,并向Skeleton发请求,然后通过Skeleton调用PersonServer的方法,最后接收返回的结果。

4. 骨架(Skeleton)的实现

Person_Skeleton代码:

 

  1. import java.io.ObjectOutputStream;      
  2. import java.io.ObjectInputStream;      
  3. import java.net.Socket;      
  4. import java.net.ServerSocket;      
  5. public class Person_Skeleton extends Thread {      
  6.     private PersonServer myServer;      
  7.     public Person_Skeleton(PersonServer server) {      
  8.         // get reference of object server      
  9.         this.myServer = server;      
  10.     }      
  11.     public void run() {      
  12.         try {      
  13.             // new socket at port 9000      
  14.             ServerSocket serverSocket = new ServerSocket(9000);      
  15.             // accept stub's request      
  16.             Socket socket = serverSocket.accept();      
  17.             while (socket != null) {      
  18.                 // get stub's request      
  19.                 ObjectInputStream inStream =      
  20.                     new ObjectInputStream(socket.getInputStream());      
  21.                 String method = (String)inStream.readObject();      
  22.                 // check method name      
  23.                 if (method.equals("age")) {      
  24.                     // execute object server's business method      
  25.                     int age = myServer.getAge();      
  26.                     ObjectOutputStream outStream =      
  27.                         new ObjectOutputStream(socket.getOutputStream());      
  28.                     // return result to stub      
  29.                     outStream.writeInt(age);      
  30.                     outStream.flush();      
  31.                 }      
  32.                 if(method.equals("name")) {      
  33.                     // execute object server's business method      
  34.                     String name = myServer.getName();      
  35.                     ObjectOutputStream outStream =      
  36.                         new ObjectOutputStream(socket.getOutputStream());      
  37.                     // return result to stub      
  38.                     outStream.writeObject(name);      
  39.                     outStream.flush();      
  40.                 }      
  41.             }      
  42.         } catch(Throwable t) {      
  43.             t.printStackTrace();      
  44.             System.exit(0);      
  45.         }      
  46.     }      
  47.     public static void main(String args []) {      
  48.         // new object server      
  49.         PersonServer person = new PersonServer("Richard", 34);      
  50.         Person_Skeleton skel = new Person_Skeleton(person);      
  51.         skel.start();      
  52.     }      
  53. }     

  

Skeleton类 extends from Thread,它长驻在后台运行,随时接收client发过来的request。并根据发送过来的key去调用相应的business method。

5. 最后一个,Client的实现

PersonClient 代码:

 

  1. public class PersonClient {      
  2.     public static void main(String [] args) {      
  3.         try {      
  4.             Person person = new Person_Stub();      
  5.             int age = person.getAge();      
  6.             String name = person.getName();      
  7.             System.out.println(name + " is " + age + " years old");      
  8.         } catch(Throwable t) {      
  9.             t.printStackTrace();      
  10.         }      
  11.     }      
  12. }      

 

Client(PersonClient)的本质是,它要知道Person接口的定义,并实例一个Person_Stub,通过Stub来调用business method,至于Stub怎么去和Server沟通,Client就不用管了。

注意它的写法:

Person person = new Person_Stub();而不是Person_Stub person = new Person_Stub();为什么?因为要面向接口编程嘛,呵呵。

//RMI实质上就是生成2个类stub,skeleton来进行参数和返回值的传递,采用值传递方式

//类似于以前写的聊天室程序,被传递的对象应实现java.io.Serializable接口

转载于:https://www.cnblogs.com/yin-jingyu/archive/2012/06/14/2549361.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux getdents 例子,Linux内建命令和外部命令(整理)

Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。【内部命令 vs. 外部命令】(1)内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程…

asterisk版本选择

背景:linux环境CentOS搭建好以后,下一步就是安装Asterisk了,但是面临的第一个问题就是面对如此多的版本该如何选择,因此不得不先对Asterisk的版本做一些分析了 一般,软件根据发布的维护的时间长短界定了两种类型&#…

暑假开始了,大家给力啊

Rome was not built in a day. 没有什么能轻易弄就 齐心努力,定能成就转载于:https://www.cnblogs.com/ustcSL/archive/2012/06/15/2550208.html

自己移植Asterisk1.8到OpenWRT下

众所周知OpenWRT是目前最流行的嵌入式Linux之一。支持广泛的CPU包括:x86、MIPS、ARM、PPC等。OpenWRT的trunk中所带的那个asterisk问题很多,缺少很多包,作者似乎仅仅是为了自己使用而移植的,而目前网上除了不详细的官方资料外也无…

延边大学c语言题库,延边大学-SPOC官方网站

课程大纲一、课程教学目的与任务本课程是理工科类的一门非常重要的计算机基础性课程,是学生学习程序设计语言和方法以及数据结构等课程的先导课程。是使学生了解有关程序设计的基本概念及常用术语,学习C 语言的基础知识、基本理论、基本概念和基本方法&a…

VC程序在没装VC的机器中运行

VC程序在没装VC的机器中运行(发表时间: 2008-6-26 16:01:00) 【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/miaowei/36283.html复制链接 分享到:0标签:vs.net2005 vs.net2003 没装VC 没有VC 由于工作需要&#xff…

Asterisk PBX 快速安装向导

Asterisk PBX 可以简单的安装到大多数 Linux发行版本上,如 Debian, RedHat等,也可以定制到专用Linux版本运行,如Astlinux就是一个定制系统的例子。Asterisk PBX还可以运行于 Windows的cygwin境下(功能受到较大限制),我们还曾经试…

STM32单片机读电压电流C语言,STM32单片机怎么检测0-24电压和电流

32的采集范围是0-3.3v你需0-24v电压衰减电路:电压跟随器高精度用运放,中精度用T型网络衰减电路,要求低用电阻分压的。电压缩小到0-3.3v范围内采集,然后用32通过一定比例再计算出实际电压扩展资料:单片机应用范围电路板…

报表中的Excel操作之Aspose.Cells(Excel模板)

本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件。这个组件的强大之处,就不多说,对于我们的报表总是会有导出Excel的处理,如果你使用微软Excel的com组件,那么对于简单的操作还行,但是多余复杂的模板&#xff0…

Android usb 权限广播,[Android]USB开发

第一:请求权限和请求权限回调(通过广播回调)注册一个广播接收器用于接收USB权限被同意或拒绝后发出的广播//注册USB设备权限管理广播IntentFilter filter new IntentFilter(ACTION_USB_PERMISSION); //ACTION_USB_PERMISSION为自定义的字符串context.registerRecei…

在飞音G801上运行OpenWRT+Asterisk

上篇文章介绍了如何在华硕RT-N11建立小型的SIP Server,本篇文章介绍将Asterisk移植到更为强大的VOIP网关G801上。G801是北京飞音时代的无线VoIP网关产品,在韩国SKT等运营商中广泛采用。G801支持802.11n 2T2R的无线路由,1WAN 4LAN的以太网&am…

自定义系统菜单

procedure SysMenuCommand(var Msg:TWMMENUSELECT);message WM_SYSCOMMAND;procedure TFormMain.SysMenuCommand(var Msg: TWMMenuSelect); begincase Msg.IDItem of0:beginMessageBox(0,PChar(茶杯),操作提示,MB_OKMB_ICONINFORMATION);end;1:beginMessageBox(0,PChar(书本),操…

android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。

Encrypt(加密工具)字符串,byte[],文件等对象的加密和解密工具集合,包含了多种加密方案。加密类型摘要相关方法简单加密换一种编码格式Base64Util单向加密只能加密,不能解密MD5Util、SHAUtil对称加密使用相同的秘钥加密和解密AESUt…

开源应用架构之asterisk

作者:Russell Bryant 翻译:jiazhengfeng Asterisk[1]是一款GPLv2协议下的开源电话应用平台。简单来说,Asterisk是一个服务器应用,能够完成发起电话呼叫、接受电话呼叫、对电话呼叫进行定制处理。 Asterisk这个项目是由Mark Spen…

垃圾回收

大部分内容来自于: http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) 垃圾回收(garbage collection)机制的基本原则是: 1. 找出程序中不会再被访问到的对象。 2. 回收这部分对象占用的资源(内存&a…

android 5.1 壁纸路径,RTFSC – Android5.1 壁纸设置流程简析 – RustFisher

Android5.1 壁纸设置流程浅析Ubuntu14.04 Android5.1 Source Insight3这里只是简单分析一下5.1里是如何设置壁纸的;这个流程和4.4有一些不同。但基本都是找个地方存放壁纸文件,需要的时候读取,设置的时候更新这里只看设置的过程。权当参考。…

如何在asterisk中限制呼叫路数?

在asterisk中,对于呼叫个数是可以通过call-limit进行限制的。限制办法是通过修改asterisk.conf中maxcalls参数,设置允许的最大呼叫数。这里的最大呼叫数是包括所有的呼叫数,出境、入境、分机间等呼叫。 为了分别限制出境/入境/分机间呼叫&…

总结DevExpress10个使用技巧

DevExpress是非常主流的.NET控件,目前全世界和中国都用很多用户使用,不过由于是英文版,初次接触的同学可能会觉得困难,这里就总结DevExpress常见的10个使用技巧。1.TextEditor(barEditItem)取文本 string editValue barEditItem1…

linux组成,Linux学习笔记之Linux组成及初识

1、常见的CPU架构:X86X64M68000ARMUltrasparcPower2、CPU的指令集精简指令集----Power复杂指令集----Intel3、使用汇编语言编写的Operation System 是很难移植在其他系统上系统是支持交叉编译的,但是需告知编译器编译的目标硬件规格是什么编译完成后的系…

WCF系列(1)—— CustomBehavior 入门

由于最近工作一直在做wcf平台上的开发,所以决定先结合自己平时工作中的经验实践写一个WCF的系列,希望能对大家有所帮助。 首先,说到WCF,就不得不提Endpoint这个概念,而Endpoint则由ABC组成,Adress,Binding和…