📄 3.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="description" content="Java,JDBC,EJB,Open Source,jdk,rmi">
<meta name="Keywords"
content="Java, servlets, Java servlet, Javascript, ActiveX, VRML,
applet, applets, directory, news, jdbc, applications,
Java applications, Java developer, Java development, developer,
classes, Jars.com, Jars, intranet, Java applet, Javabeans,
Java products, JDK, Java development kit, java development environment, JIT,
JavaPlan, enterprise tools, JVM, Java Virtual Machine, Java resources,
SUN, CGI, Perl, database, network, html,
xml, dhtml, rating, ratings, review, jars, cgi, programming,
software review, software rating">
<title>csdn_Jini技术基础结构</title>
<style>
.news { BACKGROUND: #007cd3; font-family: "宋体"; font-size: 9pt }
.t { font-family: "宋体"; font-size: 9pt }
.t1 { color:#007cd3; font-family: "宋体"; font-size: 9pt }
.white { font-family: "宋体"; font-size: 9pt;color:#FFFFFF }
.red { font-family: "宋体"; font-size: 9pt;color:#FF0000 }
A:visited {color:#0000FF}
A:hover {color: #ff6666; text-decoration: none}
.text {font-size: 12px; line-height: 160%; font-family: "宋体"}
.text1 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text1:visited {color:#000000}
.text1:hover {color: #000000}
.text2 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text2:visited {color:#000000}
.text2:hover {color: #000000}
.text3 {font-size: 12px; line-height: 100%; font-family: "宋体"; text-decoration: none}
.large {font-size: 14.8px; line-height: 130%}
</style>
</head>
<body
<!--start first table -->
<tr>
<td WIDTH="100%" VALIGN="TOP">
<tr>
<td WIDTH="100%" CLASS="white"></td>
</tr>
<tr>
<td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>Jini技术基础结构</td>
<p></p>
</tr>
<tr>
<td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
<FONT
color=#118811></FONT>Jini技术的即插即用的基础结构主要由三组协议组成:查找(Lookup)、发现(Discovery)和加入(Join)。查找服务是分布式Jini系统的基本组成部分,提供了在分布式Jini系统中服务的中央注册机制。在Jini系统中,程序找到服务的首选方法是通过查找服务,而且查找服务也是提供给管理员和用户各种访问接口的基础。
<P>
<P><STRONG>查找服务的服务模型 </STRONG>
<P>
<P>查找服务保存了一个服务的表,表中的每个元素代表了系统中可用的一项服务,其中保存了访问这项服务所需要的代码和一系列可扩充的描述服务的属性。打个比方,查找服务就像电话簿,Jini系统中的服务就像电话簿中的用户,查找服务中保存的信息就是用户的电话号码。也就是说,凡是需要访问Jini系统中的服务,就必须知道查找服务中保存的“电话号码”。但是查找服务有不少超过电话簿的优点,例如:查找服务保存的是一个动态的“电话簿”,而且,系统中的服务可以在“电话簿”中主动加入和去掉自己的“电话号码”,而查找服务也完全支持这种机制。而在以后的内容里,我们会发现更多的不同点。
<P>当服务在查找服务中注册后,会产生一个通知事件。系统管理员可以利用查找服务中的事件回调机制来收到这个通知。这就有利于系统管理员管理和维护系统。而且服务也会提供设置自身的用户界面,这个用户界面可以作为服务的属性保存到查找服务中。管理员能轻松地设置服务,不用忙着到处找各种各样的驱动程序和管理软件。
<P>在服务的有效期内,如果服务遇到问题需要引起管理员的注意,例如打印服务发现纸张短缺服务就增加一个属性来指明问题。更改后的结果会保存到查找服务中。这时,同上所述,管理员利用查找服务的事件回调机制来收到上述问题的通知。有了这个有力的机制,大大减轻了系统管理员的负担。
<P>
<P><STRONG>发现协议和加入协议 </STRONG>
<P>
<P>网络中的服务在启动后,怎样加入到分布式Jini系统中,成为Jini系统中的服务,有两个重要的必不可少的步骤。第一步肯定是找到系统中的查找服务,这个过程就是Discovery过程,用到的协议就是发现协议。第二步就是把自己注册到查找服务中,这个过程是Join过程,描述这个过程的协议就是Join协议。一项服务在完成了这两步后,就真正成为了Jini系统中的一位成员。为了准确地描述这两个协议,先介绍一下用到的术语。
<P>主机。拥有一或多个Java虚拟机并且能加入网络的一个硬件设备被称为主机。
<P>组。一组Jini服务所组成的集合。组的名字是任意的字符串,用来描述该组的性质。
<P>Discovery实体。Discovery实体就是处于同一主机内,将要开始,或者正处在找到查找服务的过程中一个或多个相互协作的Java语言中的对象的集合。
<P>Join实体。Join实体就是处于同一主机内,已经获得了查找服务,处于从查找服务中查询服务或者将自己注册到Jini系统内过程中的一个或多个相互协作的Java语言中的对象的集合。在以后的文章中,为了方便描述,将Discovery实体和Join实体统称为实体。
<P>Jini系统中的服务包括的范围很广,包括各种纯软件的服务和硬件设备的服务。如果一台主机希望加入Jini系统,成为Jini系统中的一项服务,需要具备以下几个条件:首先需要一个能够运行Jini代码的Java虚拟机;其次需要一个正确配置的网络协议栈。这个网络协议栈随着网络协议的不同而改变。这里假定采用的网络层的协议是IP协议,此时以下几个条件是必不可少的:IP地址(IP地址或者是静态IP地址,或者是由主机利用DHCP协议来取得的动态IP地址);支持TCP协议和UDP多点传送协议(在Discovery过程中会用到这两种协议)。举个例子,一台联网的、安装了JDK(Java开发工具包)的个人电脑就是一台主机。
<P>每个查找服务都有相关联的组,这样可以使Jini系统中的服务结构更有层次感。例如:一个特定的查找服务可以属于打印设备组,任何打印服务都可以注册到该查找服务中。当然,组都是预定义的。在Discovery的过程中,Discovery实体确定自己感兴趣的组,也就是自己希望加入的组,如果找到的查找服务也属于这样的组,Discovery实体就加入到这个查找服务中。这就避免了查找服务的结构过于庞大,把组织系统中服务的责任分摊给系统中多个不同的查找服务。目前,组的命名还没有一个明确的规范,Sun公司只是希望组的名字最好符合网络域名的命名规范,但是目前并没有给出如何定义组的名字的详细规范。我们相信在未来的发展过程中,随着对Jini系统中服务的组织结构层次性要求的提高,这种命名规范会随之完善起来的。
<P>1.发现
<P>在Discovery实体和查找服务交互过程中用到的协议一共有三个,分别是:多点传送请求协议(multicast request
protocol)、多点传送宣布协议(multicast announcement
protocol)和单点传送发现协议(unicast Discovery protocol)。这里首先对这三个协议进行简单的介绍。
<P>多点传送请求协议。Discovery实体使用该协议以发现Jini系统中存在的查找服务。这个协议可用于设计浏览Jini系统中的服务的浏览器。
<P>多点传送宣布协议。查找服务在启动后或者在网络崩溃的恢复过程中,利用该协议在系统中发布自己存在的数据报。
<P>单点传送发现协议。当Discovery实体和查找服务中有一个知道了另一个的网络地址和端口号时,就采用该协议来主动建立两者之间点到点的通讯。
<P>在Discovery的过程中,Discovery实体和查找服务的联系是建立在socket层上的。两者既是客户方,也是服务方。在通讯的过程中,分为两个阶段。
<P>第一个阶段:Discovery实体和查找服务各自都建立了一个单点传送服务的服务器,可以理解为普通的Internet服务器,例如FTP协议中的FTP服务器,目的就是让Discovery实体和查找服务能够建立与对方的点到点的连接。现在面临的问题是:如何让双方知道对方的服务器地址?在第二个阶段的描述中会找到这个问题的答案。
<P>第二个阶段:此时Discovery实体和查找服务都不知道对方的网络地址,但是根据Jini系统的要求,双方在网络层加入了特定的多点传送的组(这个组不是Jini系统中的组的概念,而是指网络协议中的组),而且双方都知道对方加入的网络组的组地址。由于网络协议支持向网络组中所有机器同时发送UDP数据包,利用这个特性,双方都向对方所属的组发送数据包。Discovery实体发送数据包的过程称为多点传送请求,在查找服务中发送数据包的过程称为多点传送广播宣布。在两者发送的数据包中都保存了各自的地址和其它必要信息。同时,双方都建立了一个收听发向本组的UDP数据包的服务器。Discovery实体所建立的服务器的服务称为多点传送广播收听服务,在查找服务中建立的服务器的服务称为多点传送广播请求服务。服务器把收到的数据包进行解码,就可以知道客户方的地址。在这个阶段中用到的协议就是多点传送请求协议和多点传送宣布协议。这时,Discovery过程就进入了第三个阶段。
<P>第三个阶段:此时Discovery实体和查找服务中有一个已经知道另一个的网络地址。这时双方就利用unicast
发现协议来进行通讯。协议的步骤如下:
<P>第一步:
这一步有两个对等的过程。当查找服务的单点传送服务器收到Discovery实体的连接请求后,就建立了与Discovery实体的连接;或者是Discovery的单点传送服务器收到查找服务的连接请求,建立与查找服务的连接。两者之中那一个首先发起连接是等价的。双方都创建了一个线程来负责创建与对方服务器的连接。
<P>第二步:当Discovery实体和查找服务建立连接后,由Discovery实体主动发送一个特定Discovery请求后,查找服务就把以后所需要用到的Java语言中的对象(帮助Discovery实体加入到查找服务中的对象)传给Discovery实体。
<P>有时已经发现并加入系统的实体会再次使用发现协议。例如,一个实体需要确定特定的查找服务是否还在运行,或者关心是否有新的服务进入,以及其他诸如此类的问题。这时就会再次使用发现协议。
<P>在Discovery实体的Discovery过程中,这三个发现协议互相协作。当实体启动的时候,使用多点传送请求协议来找到附近的查找服务;为了避免加重网络的负担,在经过一段时间后实体就会停止使用该协议,转变为利用多点传送宣布协议来收听查找服务的广播。在具体的实现中,这三个协议都是作为独立的线程来实现的,由Discovery实体来负责协调这三个线程的运行。
<P>2.加入
<P>Join协议向已经找到查找服务的服务提供了一系列应该遵循的标准步骤。当服务遵循这些步骤后就可以在查找服务中注册以加入Jini系统。值得注意的是,加入并不意味着简单的注册,而维持系统正确运行是加入的核心内容。
<P>由于Jini系统是一个分布式系统,为了使系统在各种情况下正常运行,设计者对网络系统崩溃后系统的恢复和系统持久运行的能力特别重视。所以在实现时,Jini系统中的服务都保存了必须保存的永久状态信息。这些信息如下:
<P>1)表示服务在Jini系统中的标识符。服务在不同的查找服务中注册的服务标识符是唯一的。
<P>2)服务具备的属性。这些属性是Java语言中的对象。服务的属性描述了服务的状态。如果服务的状态改变了,那就必须修改属性以适应这个改变。为了保证Jini系统中状态的一致性,服务保存更改后的属性后,必须在每个已经注册的查找服务中做同样的更改。
<P>3)一套服务想要加入的组的集合。
<P>4)必须注册的特定的查找服务。对于这些查找服务,服务必须注册到该查找服务中,而不论查找服务所属的组是否服务希望加入的组。
<P>每个服务都维持了一份它所注册过的查找服务的表和一份租约表。当服务在特定的查找服务中注册后,会得到一份租约,服务会分别把租约和这个查找服务加入到上述的表中。服务对租约定期续借来保证注册的有效性。如果服务需要退出特定的查找服务,服务就会取消和这个查找服务相关联的所有租约。由于租约机制的引入,使得不会出现系统资源不可回收的现象,增强了系统的鲁棒性。
<P>每一个Jini设备通过实现Dicovery和Join协议,就可以随时随地加入或退出Jini系统,从而达到即插即用的效果。
<P></P>
</td>
</tr>
</td>
</tr>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -