这几天一直在看JXTA,这个对于我这种IT菜鸟来说,很高级的东西。一开始是接触概念,发现晦涩难懂,于是去图书馆借了本《JXTA技术手册》来专门学习,自此就当开始了JXTA的学习了吧
首先是JXTA的配置,自己不知道书上那个SHELL怎么用,然后发现一开始可以从具体的例子的出发。
例子:一个个餐馆RestoPeer通过发现或者加入RestoNet,让一个个HungerPeer发现并加入其中,然后开始进行拍卖。
RestoPeer的实现过程是这样的:首先创建一个Peer,这个Peer属于NetPeerGroup,它通过NetPeerGroup的发布服务来发现RestoPeer,首先检查本地缓存:
ae=hdisco.getLocalAdvertisements(DiscoveryService.GROUP,"Name","RestoNet");
GetLocalAdvertisements(int tag,String s1,String S2) 该函数取得本地的通告缓存,此处第一个参数是点组服务,然后是通告的属性,最后是属性值。
如果没有检测到本地缓存,则利用点发现协议(PDP)在网络上查找:
hdisco.getRemoteAdvertisements(null, DiscoveryService.GROUP,"Name","RestoNet",1,null);第一个参数是对等体ID,本处是空,结果是搜索子网的所以Peers,只有一个对等体通告,故而参数为1。
设置三次查找,如果没找到,则创建一个:
ModuleImplAdvertisement impladv=netpg.getAllPurposePeerGroupImplAdvertisement();//创建一个通常的通告
restoNet=netpg.newGroup(
mkGroupID(),//对等体ID
impladv,
"RestoNet",
"RestoNet, Icn.");
如果找到缓存的RestoGroup,就加入其中:
restoNetAdv=(PeerGroupAdvertisement)ae.nextElement();//取得缓存通告
restoNet=netpg.newGroup(restoNetAdv);//通告缓存通告加入以前的对等体
自此就已经创建了RestoGroup,并可以运行了,第一次出现配置信息,输入用户名和密码,我把其他选项都虚选了,这个现在还不懂,以后再来解释。然后运行,下次运行的时候就已经有这个缓存信息了。
一下是RestoGroup源码:
RestoPeer.java
import java.io.IOException; import java.net.URL; import java.util.*; import net.jxta.peer.*; import net.jxta.peergroup.*; import net.jxta.discovery.*; import net.jxta.pipe.*; import net.jxta.protocol.ModuleImplAdvertisement; import net.jxta.protocol.PeerGroupAdvertisement; import net.jxta.exception.*; import net.jxta.id.IDFactory; public class RestoPeer { /** * @param args */ private PeerGroup netpg=null;//创建NetPeerGroup private PeerGroup restoNet=null;//创建restoNet private String brand="Chez jxta"; private int timeout=3000;//线程等待时间 private DiscoveryService disco; private PipeService pipes; static String groupURL="jxta:uuid-4d6172676572696e204272756e6f202002"; public static void main(String[] args) { // TODO Auto-generated method stub RestoPeer myapp=new RestoPeer(); myapp.startJxta(); System.exit(0); } private void startJxta(){ try{ netpg=PeerGroupFactory.newNetPeerGroup();//加入NetGroup }catch(PeerGroupException e){ System.out.println("错误:没能加入NetPeerGroup"); System.exit(1);//? } try{ joinRestoNet(); }catch(Exception e){ System.out.println("错误:不能加入或者创建 RestoPeer"); System.exit(1);//? } System.out.println("正在等待顾客..."); /*later code......*/ } private void joinRestoNet() throws Exception{//创建或者加入restoNet int count=3; System.out.println("正在尝试发现 RestoNet"); DiscoveryService hdisco=netpg.getDiscoveryService();//从NetPeerGroup中获取发现服务 Enumeration ae=null; //用于保存发现的peer??? while(count-->0)//查找RestoNet { try{ ae=hdisco.getLocalAdvertisements(DiscoveryService.GROUP,"Name","RestoNet"); //在本地缓存中查找Restonet if((ae!=null)&& ae.hasMoreElements()) break; hdisco.getRemoteAdvertisements(null, DiscoveryService.GROUP,"Name","RestoNet",1,null); //在NetGroup中查找 try{ Thread.sleep(timeout); //等待响应 }catch(Exception e){} }catch(IOException e){ } } System.out.println(ae.hasMoreElements()); PeerGroupAdvertisement restoNetAdv=null; if(ae==null || !ae.hasMoreElements()) { System.out.println("不能找到RestoNet,将创建她"); try{ ModuleImplAdvertisement impladv=netpg.getAllPurposePeerGroupImplAdvertisement(); restoNet=netpg.newGroup( mkGroupID(), impladv, "RestoNet", "RestoNet, Icn."); restoNetAdv=netpg.getPeerGroupAdvertisement(); }catch(Exception e){ System.out.println("从网络中创建RestiNet遇到错误"); } }else { try{ System.out.println("已从从缓存中创建RestiNet"); restoNetAdv=(PeerGroupAdvertisement)ae.nextElement(); restoNet=netpg.newGroup(restoNetAdv); System.out.println("已从从缓存中创建RestiNet"); }catch(Exception e){ System.out.println("从缓存中创建RestiNet失败"); } } try{ disco=restoNet.getDiscoveryService(); pipes=restoNet.getPipeService(); }catch(Exception e){ System.out.println("从RestiNet中取得服务失败"); } System.out.println("RestoNet 餐馆("+brand+")在线"); return; } private PeerGroupID mkGroupID() throws Exception{ return (PeerGroupID) IDFactory.fromURL(new URL("urn","",groupURL)); } } |