?? 第五章client search(查找客戶).htm
字號:
<html>
<head>
<title>新時代軟件教程:操作系統 主頁制作 服務器 設計軟件 網絡技術 編程語言 文字編輯</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋體}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1 {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
<p align="center"><big><strong>第五章Client Search(查找客戶)</strong></big></p>
<p>一個客戶利用lookup service支持的ServiceRegistrar對象查找lookup service上的服務:
<pre><code>
public Class ServiceRegistrar {
public java.lang.Object lookup(ServiceTemplate tmpl)
throws java.rmi.RemoteException;
public ServiceMatches lookup(ServiceTemplate tmpl,
int maxMatches)
throws java.rmi.RemoteException;
}
方法lookup用ServiceTemplate類來描述要尋找的服務:
package net.jini.core.lookup;
public Class ServiceTemplate {
public ServiceID serviceID;
public java.lang.Class[] serviceTypes;
public Entry[] attributeSetTemplates;
ServiceTemplate(ServiceID serviceID,
java.lang.Class[] serviceTypes,
Entry[] attrSetTemplates);
}
</code></pre>
<P> 如果不知道,serviceID為null。attributeSetTemplates是一個執行屬性匹配的Entry集合。
方法lookup中主要的參數是一組serviceTypes。每個輸出的服務是一個類的實例;但是在查找中不需使用
類實例,因為那時客戶已經得到了該實例,不需要查找了!下一個重要的東西是Class對象,因為輸出服務要
被檢查是否是某個類的實例。但是如果你要得到某個類對象,為什么不在客戶端簡單的用new生成呢?一般來說,
輸出類是要求類的子類,并且這些子類將提供比客戶用new生成類更多的東西。所以客戶將要求一個超類或一個
接口對象。為了更具體些,例如一個toaster應該被定義為接口(interface):
<pre><code>
public interface Toaster {
void setDarkness(int dark);
void startToasting();
}
</code></pre>
而一個具體的Breville ``Extra Lift'' toaster要具體的實現該接口,其他的toasters也是一樣。
<pre><code>
public Class BrevilleExtraLiftToaster implements Toaster {
void setDarkness(int dark) {
...
}
void startToasting() {
...
}
}
</code></pre>
烤面包機(toaster)開始時,它輸出一個類BrevilleExtraLiftToaster對象到lookup service。但是客戶并不知道toaster的類型,所以會有如下的請求:
<pre><code>
Class[] toasterClasses = new Class[1];
Toaster toaster = null;
try {
toasterClasses[0] = new Class.forName("Toaster");
} catch(ClassNotFoundException e) {
System.err.exit(1);
}
ServiceTemplate template = new ServiceTemplate(null, classes,
null);
try {
toaster = (Toaster) registrar.lookup(template);
} catch(java.rmi.RemoteException e) {
System.err.exit(2);
}
</code></pre>
注意lookup方法可以拋出一個例外。如果要求的服務不可序列化,該例外就會發生。
最后,傳送到客戶端的對象是實現接口Toaster,被強制轉換成該類型。這個對象有兩個方法setDarkness() 和startToasting()。關于烤面包機沒有其他信息可用,因為該接口沒有指定更多的方法,
在這種情況下屬性集合為null。所以客戶可以調用:
<pre><code>
toaster.setDarkness(1);
toaster.startToasting();
</code></pre>
<P>1、ServiceMatches
<P>如果客戶想查找多個來自指定lookup service的匹配服務,就應該在對象ServiceMatches中指定
要求返回的匹配數目。
<pre><code>
package net.jini.core.lookup;
public Class ServiceMatches {
public ServiceItem[] items;
public int totalMatches ;
}
</code></pre>
數組items中的元素數目和totalMatches值相同。但是,并不是該數組中的所有元素都必須非空!
當用戶只要求一個服務的時候,如果該服務是不可序列化的,則出現例外;但是如果要求多個服務,
即使其中一個服務是不可序列化的,也不會產生例外,因為其他服務還是可用的,這時該服務就是
空的(null)。
<pre><code>
ServiceMatches matches = registrar.lookup(template, 10);
for (int n = 0; n < matches.totalMatches; n++) {
Toaster toaster = (Toaster) matches.items[n];
if (toaster != null) {
toaster.setDarkness(1);
toaster.startToasting();
}
}
</code></pre>
</table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -