这几天一直在看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));
}
}
|