熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

如何使用JXTA技術建立P2P網絡

2013-11-23 17:57:43  來源: Javascript 

  作者朱傳輝

  通過之前將近一個月對於JXTA技術的研究終於大致了解了PP網絡JXTA技術的JAVA語言實現過程特整理出來以供大家交流討論其實關於概念和該技術的介紹也可以找到一些資料在此我就不再介紹我直接通過代碼來描述一個PP網絡在JXTA技術下用JAVA語言實現的過程

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

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

 第三步我們將開始代碼編寫了新建一個類其main方法及其調用方法代碼如下


  

  public static void main(String[] args) {
 RestoPeer myapp = new RestoPeer();   //此處實例化一個對等體對象
 myappstartJxta();                                  //此處啟動JXTA方法用來加入組獲得服務等等
 Systemexit();                                      //功能至完成退出系統
 }
public void startJxta() {
 try {
         加入默認對等組NetPeerGroup
 netpg = new NetPeerGroupFactory()getInterface();
 } catch (PeerGroupException e) {
    // TODO Autogenerated catch block
    eprintStackTrace();
}
  
 }

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

 第四步我們需要獲得默認對等組為我們提供的發現服務

    DiscoveryService disco = netpggetDiscoveryService();

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

  

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

 從NetPeerGroup獲得發現服務
 DiscoveryService hdisco = netpggetDiscoveryService();

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

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

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

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

 // 線程暫停一下等待對等體內該發現請求
  try {
         Threadsleep(timeout);
         } catch (InterruptedException e) {
           // TODO Autogenerated catch block
               eprintStackTrace();
               }
          } catch (IOException e) {
            // TODO Autogenerated catch block
               eprintStackTrace();
               }
       }

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

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

// 如果該組不在給出提示信息創建該組
 Systemoutprintln(Could not find the RestoNext peergroup;createing me);
try {
         // 創建一個新的對等組RestoNet全能對等組
         // 通過NetPeerGroup獲得一個一般對等組的通告
         ModuleImplAdvertisement implAdv = netpggetAllPurposePeerGroupImplAdvertisement();

        // 通過NetPeerGroup創建一個新的對等組JXTA會自行發布該對等組通告
        //參數依次為對等組ID通告組名描述
        restoNet = netpgnewGroup(mkGroupID() implAdv RestoNetRestoNetInc);

        // 獲得一個對等組通告
        restoNetAdv = netpggetPeerGroupAdvertisement();
        } catch (Exception e) {
            // TODO Autogenerated catch block
            eprintStackTrace();
        }
} else {
           // RestoNet通告在緩存內找到意味著我們可以加入這個存在的組
           // 在集合中提取一個對等組通告元素
           restoNetAdv = (PeerGroupAdvertisement) aenextElement();
try {
          // 加入該對等組由於該通告已經發布JXTA不會再行發布
          restoNet = netpgnewGroup(restoNetAdv);
          Systemoutprintln(找到RestoNet對等組並加入存在的該組);
       } catch (PeerGroupException e) {
          // TODO Autogenerated catch block
          eprintStackTrace();
       }
}

   // 獲得RestoNet提供的發現服務和管道服務
   disco = restoNetgetDiscoveryService();
    pipes = restoNetgetPipeService();

    Systemoutprintln(RestoNet Restaurant_( + brand + ) is online);
    return;
}

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

 至此我們的機器已處於一個PP網絡中了其實在我們得到默認對等組實例時我們已經在PP網絡中了只不過我們現在已經通過網絡發現找到或創建了我們需要的對等組並加入其中以後我們便可以提供並消費該對等組提供的服務或是該對等組內對等體提供的服務了

 以上為最簡單的構建PP網絡加入對等組的簡單應用以後會陸續貼出利用JXTA技術實現普通字符通訊和媒體數據廣播等應用敬請期待!以上所有均為個人實踐體會及理解如若有誤還望不吝賜教進行批評指正如需交流請加MSN

源代碼下載

 日前我發表了一篇關於JXTA技術建立PP網絡的文章得到了廣大朋友們的關注和支持現應朋友們要求我將一些測試源碼上傳上來供大家參考討論還望大家多提寶貴意見!需要說明的在srcrar中的兩個文件需要放到不同的工作目錄下方可運行成功因為JXTA第一次運行時會為每個對等體設置緩存目錄如在同一工作區內後者會將前者信息覆蓋因此建議用不同工作區最好是兩台電腦來測試在第一次運行時會彈出一個配置窗口大家只需填寫用戶名和密碼即可其他設置暫時不須關心密碼必須大於八位
另外三個包為JXTA類庫請大家解壓後導入項目中即可


srcrar
librarsrc
librar
librar


From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25439.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.