又可分為給 JavaSE 使用的 JXSE 及給 JavaME 使用的 JXME,也有其他語言的版本,
如: JXTA-C ,有空可以多加研究比較,而目前使用的版本為 JXSE,簡單介紹如下:
JXTA 是一個 p2p 的協定,規範了一個 p2p 網路上的所有 peer (節點) 的溝通標準,
有別於傳統的 client-server 架構,p2p 網路上有許多的新名詞,如:
peer、peer group、ad、RDV…等,在官方的說明文件中都有詳細說明,在此不多介紹,
JXTA 協定中定義了許多 peer 種類,以 EDGE 最常見,另外還有構成 JXTA 網路架構
的 RDV 節點,以及讓防火牆或 NAT 內的 EDGE 可以向外界RDV構通的 RELAY
節點,架構如下列官方文件裡的圖:

JXSE 下載下來解開有四個 jar:
jxse.jar、bcprov-jdk14.jar、javax.servlet.jar、org.mortbay.jetty.jar
其中似乎只要有 jxse.jar 即可 compile 而執行需要 jxse.jar 加 bcprov-jdk14.jar
javax.servlet.jar、org.mortbay.jetty.jar 目前的用處不明。
JXSE 程式以 net.jxta.platform.NetworkManager 類別來啟動及管理 JXTA 網路
建立 NetworkManager 時需指定 peer 種類及相關資訊:
jxtaNetMan = new NetworkManager(
NetworkManager.ConfigMode.EDGE,
FEELER_ENTITY_PEER_NAME,
new File(new File(JXTA_HOME), FEELER_ENTITY_PEER_NAME).toURI()
);
第一個參數為 peer 種類,第二個參數為 peer 名稱,第三個參數為 peer 資料暫存目錄
建立好 NetworkManager 之後可以進行一些設定:
jxtaNetMan.setConfigPersistent(true); // 啟動儲存設定功能
// 使用官方提供的預設 RDV ,但似乎有問題,無法連線
//會不斷連往 http://rdv.jxtahosts.net/cgi-bin/rendezvous.cgi?3 查詢 RDV
jxtaNetMan.setUseDefaultSeeds(true);
jxtaNetCfg = jxtaNetMan.getConfigurator(); // 取得設定物件,以進行更多設定
// 加入自定的 RDV 位址,範例: "tcp://www.bennu.tw:9701"
jxtaNetCfg.addSeedRendezvous(new URI(NetService.FEELER_RDV_URI));
jxtaNetCfg.save(); // 儲存設定到 peer 資料暫存目錄下的 PlatformConfig 檔案
設定之後,即可以 startNetwork() 啟動這一個 peer 的運作。
// startNetWork() 傳回 net group
infrastructurePeerGroup = jxtaNetMan.startNetwork();
每一個裝置或者jvm應該可以同時擁有多個節點,同時扮演多個角色,如:
可以既是某些 EDGE 的 RDV 又是其他 RDV 的 EDGE ,但是目前測試的結果,
無法在同一個 jvm 下啟動兩次 JXTA network
啟動完成後會回傳一個 peer group 物件,每一個 peer 最少都會加入一個 peer group
這個 peer group 稱之為 net peer group,可以想像成整個 JXTA 網路是一個 peer group
而如果要另外建立 peer group 也一定是此 net peer group 的子集,如下圖:
discovery service、pipe service、rdv service、… 等,JXTA定義了許多 service
可以讓 peer 與 peer 進行資料傳遞,而不需在乎每個 peer 所在的網路環境。
其中需先注意 rdv service ,以 RDV peer 來說,除了在建立 NetworkManager 時,
第一個參數給予 NetworkManager.ConfigMode.RENDEZVOUS 仍然無法讓其他
EDGE peer 連上這一個 rdv peer ,還需在 startNetwork() 後啟動一下 rdv service:
jxtaNetMan.getNetPeerGroup().getRendezVousService().startRendezVous();
如此才可以開始提供 rdv 功能。
而 EDGE peer 要連上 RDV peer 則是使用 :
boolean connected = jxtaNetMan.waitForRendezvousConnection(timeout);
waitForRendezvousConnection 是一個 block 方法,會一直嘗試連線到成功或是
timeout 時間到為止,而回傳 boolean 表示連線成功(true)或失敗(false)。
目前 timeout 必須設定長一點,即使是在 local net 也需要 5 分鐘以上比較好。
可能是由於使用廣播的方式,導致連線效率不好,官網上可以看到已有改進的工作
除了 EDGE 可以連上 RDV,RDV 也可透過同一 method 連上其他 RDV,
以構成 RDV 主幹網路,而 EDGE peer 顧名思議就是散佈在 RDV 主幹網路的邊緣。
沒有留言:
張貼留言