动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.用JBuilder 2005实现重构之认识重.
.PreparedStatement.
.实例论证J2ME的事件传输机制.
.Java基础:Date和Calendar类的使.
.Java设计模式研究之Flyweight模式.
.Java中类型转换的特例.
.Taglib原理和实现 第六章:标签内.
.Java Web Start介绍.
.java连接MySql数据库!.
.Designing “query by criteria”.
.自己写的一个支持200人在线的聊天.
.关于中Tag File的一点补充.
.使用Resin3.0配置运行Java Servl.
.错误的堆大小产生的“堆问题”.
.使用Sets.
.嵌入式Java的应用实例.
.J2EE TM 蓝图摘要.
.Maven 安装实践.
.Java数组学习心得,欢迎拍砖.
.Hibernate 的简单 Read 性能测试.

RMI规范--第三章

发表日期:2008-1-5 |



  主题:
Stub 与 skeleton
远程方法调用中的线程使用
远程对象的垃圾收集
动态类的加载
通过代理服务器透过防火墙的 RMI
3.1 Stub 与 skeleton
在与远程对象的通信过程中,RMI 将使用标准机制(用于 RPC 系统):stub
与 skeleton。远程对象的 stub 担当远程对象的客户本地代表或代理人角色。
调用程序将调用本地 stub 的方法,而本地 stub 将负责执行对远程对象的方
法调用。在 RMI 中,远程对象的 stub 与该远程对象所实现的远程接口集相同。
调用 stub 的方法时,将执行下列操作:
初始化与包含远程对象的远程虚拟机的连接。
对远程虚拟机参数的进行编组(写入并传输)
等待方法调用结果
解编(读取)返回值或返回的异常
将值返给调用程序
为向调用程序展示比较简单的调用机制,stub 将参数的序列化和网络级通信隐
藏了起来。
在远程虚拟机中,每个远程对象都可以有相应的 skeleton(纯 JDK1.2 环境中
不需要 skeleton)。skeleton 负责将调用分配给实际的远程对象实现。它在
接收入进入方法调用时执行下列操作:
解编(读取)远程方法的参数
调用实际远程对象实现上的方法
将结果(返回值或异常)编组(写入并传输)给调用程序
由于推出于 JDK1.2 及附加的 stub 协议,使得在纯 JDK1.2 环境中无需使用
skeleton。相反,应使用通用代码代替 JDK1.1 中的 skeleton 履行其职责。
stub 和 skeleton 由 rmic 编译器生成。
3.2 远程方法调用中的线程使用
RMI 运行时分配给远程对象实现的方法可能在也可能不在独立的线程中执行。
RMI 运行时将无法担保远程对象与线程的映射关系。因为同一个远程对象的远程
方法调用可能会同时执行,所以远程对象实现需确保其实现是线程安全的。
3.3 远程对象的垃圾收集
与在本地系统中相同,在分布式系统中自动删除那些不再被任何客户机引用的远
程对象是令人满足的。这可以将程序员从跟踪远程对象客户机以便适时终止的任
务中解脱出来。RMI 使用与 Modula-3 网络对象相似的引用计数的垃圾收集算
法(参见 1994 年 5 月数字设备公司系统研究中心技术报告 115 中 Birrell、
Nelson 和 Owicki 的“网络对象”)。
要实现引用计数垃圾收集,RMI 运行时需要跟踪每个 Java 虚拟机内的所有活
动引用。当活动引用进入 Java 虚拟机时,其引用计数将加 1。首次引用某对
象时会向该对象的服务器发送“referenced”消息。当发现活动引用在本地虚
拟机中并未被引用时,该数将减 1。放弃最后的引用时,未被引用的消息将被发
送到服务器。协议中存在很多微妙之处,其中大部分都与维护引用或未引用消息
的次序有关,可确保对象不被过早地收集。
当某远程对象不被任何客户机所引用时,RMI运行时将对其进行弱引用。假如不存在该
对象的其它本地引用,则弱引用将答应 Java 虚拟机的垃圾收集器放弃该对象。
通过保持对对象的常规引用或弱引用,分布式垃圾收集算法可与本地 Java 虚拟
机的垃圾收集器以常规方式进行交互。
只要存在对远程对象的本地引用,就不能将远程对象当作垃圾进行收集,而且该
远程对象也可在远程调用中传送或返回客户机。传递远程对象也将同时把目标虚
拟机的标识符添加到被引用集中。需要未引用通知的远程对象必须实现
java.rmi.server.Unreferenced 接口。当这些引用不再存在时,将调用
unreferenced 方法。当发现引用集为空时,也将调用 unreferenced。因此,
unreferenced 方法可能会被多次调用。只有当没有本地和远程引用时,才可收集
远程对象。
注重,假如在客户机和远程服务器对象之间存在网络分区,则可能会过早地收集
、远程对象(因为传输可能认为客户机已失效)。由于可能会出现过早收集的现
象,因此远程引用将不能保证引用的完整性。换句话说,远程引用实际上可能指
向不存在的对象。使用此类引用时将抛出必须由应用程序处理的 RemoteExcepti
on。
3.4 动态类加载
RMI 答应传入 RMI 调用中的参数、返回值和异常为任何可序列化对象。RMI 使
用对象序列化机制将数据从一个虚拟机传输到另一个虚拟机,同时用相应的位置
信息注释调用流,以便在接收端上加载类定义文件。
当解编远程方法调用的参数和返回值以使之成为接收虚拟机中的有效对象时,流
中所有类型的对象都需要类定义。解编进程将首先尝试通过本地类加载上下文(
当前线程的上下文类加载器)中的名称来解析类。RMI 也提供动态加载作为参数
和返回值传送的实际对象类型的类定义的手段(其中远程方法调用的参数和返回
值来自传送终点所指定的网络位置)。这包括远程 stub 类的动态下载 - 该类
对应于特定远程对象实现类(用于包含远程引用)及 RMI 调用中通过值传送的
任何其它类型,例如在解编端的类加载上下文中尚不可用的,声明参数类型的子
类。
要支持动态类加载,RMI 运行时应使用用于编组、解编 RMI 参数和返回值的编
组流的特定 java.io.ObjectOutputStream 和 java.io.ObjectInputStream
子类。这些子类覆盖了 ObjectOutputStream 的 annotateClass 方法和
ObjectInputStream 的 resolveClass 方法,以便就何处定位包含对应于流中
类描述符的类定义的类文件交换信息。
对于每个写入 RMI 编组流的类描述符,annotateClass 方法将把类对象调用
java.rmi.server.RMIClassLoader.getClassAnnotation 的结果添加到流中。
该结果可能为空,也可能是表示 codebase URL 路径(以空格分隔的 URL 列表)
的 String 对象。利用该 codebase URL 路径,远程终点可下载所给类的定义
文件。
对于从 RMI 编组流中读取的每个类描述符,resolveClass 方法将从流中读取
单个对象。假如该对象是 String(且 java.rmi.server.useCodebaseOnly
属性不是 true),则 resolveClass 将返回调用 RMIClassLoader.loadClass
的结果,并以所注解的 String 对象作为第一个参数,以类描述符中所需类名作
为第二个参数。否则,resolveClass 将返回调用 RMIClassLoader.loadClass
的结果,并以所需的类名作为唯一参数。
有关 RMI 中类加载的具体信息,参见“RMIClassLoader 类”(5.6)一节。
3.5 通过代理服务器透过防火墙的 RMI
RMI 传输层通常试图将直接套接字在Internet的主机上打开。然而,许多Intranet
的防火墙不答应这样做。因此,缺省 RMI 传输提供两种基于 HTTP 的机制,可
使防火墙后的客户机调用驻留在防火墙外的远程对象方法。
3.5.1 如何将 RMI 调用包装在 HTTP 协议内
要透过防火墙,传输层可在防火墙信任的 HTTP 协议范围内嵌入 RMI 调用。将
RMI 调用数据作为 HTTP POST 请求的主体发送出去后,反馈信息将返回到 HTTP
响应主体内。传输层可通过以下两种方法构造 POST 请求:
1. 假如防火墙代理服务器可以把 HTTP 请求定向到主机的任意端口,HTTP
请求就会被直接转发到 RMI 服务器正在监听的端口上。目标计算机上的缺省RMI
传输层可通过能识别并解码 POST 请求内的 RMI 调用的服务器套接字进行监听。
2. 假如防火墙代理服务器只能把 HTTP 请求定向到某个已知的 HTTP 端口,
该调用就会被转发到正在主机端口 80 上监听的 HTTP 服务器,而且将执行 CGI
脚本以转发对同一计算机上目标 RMI 服务器端口的调用。
3.5.2 缺省套接字工厂
RMI 传输扩展 java.rmi.server.RMISocketFactory 类以提供作为客户机和服
务器套接字源提供者的套接字工厂的缺省实现。该缺省套接字工厂可创建套接字
以透明地提供防火墙通道机制,如下所示:
客户机套接字将自动尝试与无法用直接套接字联系的主机进行 HTTP 连接。
服务器套接字将自动检测新近接收的连接是否 HTTP POST 请求,假如是,则只
将请求主体送给传输层,同时将其输出格式转化为 HTTP 响应。
工厂的 java.rmi.server.RMISocketFactory.createSocket 方法将提供带有
此缺省行为的客户机端套接字。工厂的
java.rmi.server.RMISocketFactory.createServerSocket
方法将提供带有此缺省行为的服务器端套接字。
3.5.3 配置客户机
无需非凡配置即可使客户机透过防火墙发送 RMI 调用。
但假如将 java.rmi.server.disableHttp 属性的布尔值设置为“true”,客
户机即可禁止将 RMI 调用包装为 HTTP 请求。
3.5.4 配置服务器
------------------------------------------------------------------
注重 - 主机名不应为主机的 IP 地址,因为某些防火墙代理服务器不传送这种
主机名。
------------------------------------------------------------
1. 服务器主机域外的客户机要想调用服务器远程对象的方法,则必须找到该
服务器。因此,服务器导出的远程引用必须包含服务器主机的全名。
本信息可否用于运行服务器的 Java 虚拟机,取决于服务器平台和网络环境。
假如不可用,则启动服务器时必须通过 java.rmi.server.hostname 属性指定主
机的全名。
例如,在 chatsubo.javasoft.com 上可用以下命令启动 RMI 服务器类
ServerImpl:
java -Djava.rmi.server.hostname=chatsubo.javasoft.com ServerImpl
2. 假如服务器不支持防火墙后可传送到随意端口的 RMI 客户机,则可使用
如下配置:
a. HTTP 服务器在端口 80 上监听。
b. CGI 脚本的位置为别名 URL 路径
/cgi-bin/java-rmi.cgi
该脚本:
- 调用本地 Java 解释程序以执行可将请求传送到适当 RMI 服务器端口的传
输层内部类。
- 在 Java 虚拟机中,以与 CGI 1.0 环境变量相同的名称和值定义属性。
用于 Solaris 和 Windows 32 操作系统的 RMI 分布式版本中提供了示例脚
本。注重,脚本必须指定服务器上 Java 解释程序的完整路径。
3.5.5 性能问题与局限
在不考虑代理服务器传送延迟的情况下,由 HTTP 请求传送调用至少要比通过直
接套接字传送慢一个数量级。
因为透过防火墙只能在一个方向初始化 HTTP 请求,同时防火墙外的主机也无法
回调客户机的方法调用,所以客户机无法将其自身的远程对象导到防火墙以外。
上一篇:对Robocode的创始人MatNelson的一次采访 人气:521
下一篇:RMI规范--第二章 人气:627
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-2 OpenPNE中文 v2.12.5 for win 中
2008-12-2 谷秋精品课程软件课程版 v2.3
2008-12-2 晴天电影系统(带一键迅雷/自定义
2008-12-2 QQip138闪字程序
2008-12-2 SmartWeb企业智能建站系统 v1.0.2
2008-12-2 梦想不死个人主页 v2009
2008-12-2 开良ASP小偷程序生成器 v1.1
2008-12-2 toolxp.cnalexa世界排名查询 php
2008-12-2 腾讯留言板 v1.3
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成