天天看點

使用技巧:怎樣用JXTA技術建立P2P網絡

第一步,大家需要下載下傳JXTA的類庫,在http://www.jxta.org上可以下載下傳到最新版本。我這裡提供JXTA2.4.1的版本(很抱歉,超過限制上傳不了!我會在論壇上另外上傳,包括CHM格式的技術手冊)。

第二步,建立一個JAVA工程,将這些JAR包添加至建構路徑(此處是采用Eclipse,用其他IDE,或是直接将這些JAR包添加到CLASSPATH也行)。

第三步,我們将開始代碼編寫了。建立一個類。其main方法及其調用方法代碼如下:

public static void main(String[] args) {
 RestoPeer myapp = new RestoPeer();   //此處執行個體化一個對等體對象。
 myapp.startJxta();      //此處啟動JXTA方法,用來加入組,獲得服務等等。
 System.exit(0);         //功能至完成,退出系統。
 }
public void startJxta() {
 try {
         加入預設對等組NetPeerGroup
 netpg = new NetPeerGroupFactory().getInterface();
 } catch (PeerGroupException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
  ......
 }      

此處需要注意的是,由于JXTA技術的不斷更新,其類庫結構和實作已發生很大變化,此處加入預設對等組是2.4.1版本中的新方法。JXTA技術手冊上的方法已過時。

第四步,我們需要獲得預設對等組為我們提供的發現服務:

DiscoveryService disco = netpggetDiscoveryService();

此時,我們便可以利用disco服務來查找我們所需的廣告了。

第五步,我們需要查找一個屬于我們自己的對等組,如果找不到,我們則建立一個這樣的對等組。此時隻是為了得到我們所需要的服務。因為每個對等組裡所提供的服務并不全部相同。我們通常會把相同的目的的對等體通過一個對等組來組織起來。一個加入對等組的代碼如下:(此例采用JXTA技術手冊裡的一個餐館的拍賣服務案例來描述)

// 加入拍賣組
 private void joinRestoNet() {
 int count = 3; // 試圖發現的最高循環次數
 System.out.println(" 試圖發現組名為 RestoNet 對等組");

 從NetPeerGroup獲得發現服務
 DiscoveryService hdisco = netpg.getDiscoveryService();

 Enumeration ae = null; // 記錄發現的廣告。

 // 循環直到我們發現RestoNet對等組或是直到我們達到了試圖預期發現的次數。
 while (count-- > 0) {
 try {
 // 第一次搜尋對等體的本地緩存來查找RestoNet對等組通告。
// 通過NetPeerGroup組提供的發現服務發現"Name"屬性為"RestoNet"的對等組
 ae = hdisco.getLocalAdvertisements(DiscoveryService.GROUP,"Name", "RestoNet");

// 如果發現RestoNet對等組通告,該方法完成,退出循環。
 if ((ae != null) && ae.hasMoreElements()) {
       break;
     }

// 如果我們沒有在本地找到它,便發送發現遠端請求。
 // 參數依次為要查找的對等體ID,為空時不以此為發現條件;發現的通告類型,取值還有PEER,和ADV;
 // 要發現的通告屬性名稱;屬性取值;需擷取的最大通告數量;發現監聽器
  hdisco.getRemoteAdvertisements(null, DiscoveryService.GROUP,"Name", "RestoNet", 1, null);

 // 線程暫停一下等待對等體內該發現請求。
  try {
         Thread.sleep(timeout);
         } catch (InterruptedException e) {
           // TODO Auto-generated catch block
               e.printStackTrace();
               }
          } catch (IOException e) {
            // TODO Auto-generated catch block
               e.printStackTrace();
               }
       }

 /*-------------------------------------------
 *     以上為循環發現目标組過程,以下為加入過程
 * ----------------------------------------*/
                
 // 建立一個對等組通告引用
PeerGroupAdvertisement restoNetAdv = null;

 // 檢查我們是否找到RestoNet通告。如果沒有找到,表示我們可能是第一個試圖加入該組的對等體,
//或是其他知道RestoNet組的對等體成員已經關閉或不可到達
// 萬一出現這種情況,我們必須建立一個RestoNet對等組。
 if (ae == null || !ae.hasMoreElements()) {

// 如果該組不在,給出提示資訊,建立該組
 System.out.println("Could not find the RestoNext peergroup;createing me");
try {
         // 建立一個新的對等組RestoNet,全能對等組
         // 通過NetPeerGroup獲得一個一般對等組的通告。
         ModuleImplAdvertisement implAdv = netpg.getAllPurposePeerGroupImplAdvertisement();

        // 通過NetPeerGroup建立一個新的對等組,JXTA會自行釋出該對等組通告,
        //參數依次為對等組ID,通告,組名,描述
        restoNet = netpg.newGroup(mkGroupID(), implAdv, "RestoNet","RestoNet,Inc.");

        // 獲得一個對等組通告
        restoNetAdv = netpg.getPeerGroupAdvertisement();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
} else {
           // RestoNet通告在緩存内找到意味着我們可以加入這個存在的組。
           // 在集合中提取一個對等組通告元素
           restoNetAdv = (PeerGroupAdvertisement) ae.nextElement();
try {
          // 加入該對等組,由于該通告已經釋出,JXTA不會再行釋出。
          restoNet = netpg.newGroup(restoNetAdv);
          System.out.println("找到RestoNet對等組,并加入存在的該組");
       } catch (PeerGroupException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
       }
}

   // 獲得RestoNet提供的發現服務和管道服務
   disco = restoNet.getDiscoveryService();
    pipes = restoNet.getPipeService();

    System.out.println("RestoNet Restaurant_(" + brand + ") is on-line");
    return;
}      

此時,我們已經加入或者建立了一個RestoNet對等組了,該組位于NetPerrGroup組内,是以通過NetPeerGroup提供的發現服務可以找到該組廣告。如若找不到,則跟網絡環境有關,可能是等待時間太短或是循環次數太少,因為P2P網絡是不可靠的網絡,是以這個參數很難确定,需要根據實際情況來設定。

至此,我們的機器已處于一個P2P網絡中了,其實在我們得到預設對等組執行個體時我們已經在P2P網絡中了,隻不過我們現在已經通過網絡發現,找到或建立了我們需要的對等組并加入其中,以後我們便可以提供并消費該對等組提供的服務或是該對等組内對等體提供的服務了。 

繼續閱讀