作者朱传辉
通过之前将近一个月对于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