使用JXTA技术建立P2P网络
setve 发表于 2007-05-15 15:12:27作者:朱传辉 来源:原创
评论数:33 点击数:41,369 投票总得分:4 投票总人次:2
关键字:p2p,jxta,java
摘要:
通过之前将近一个月对于JXTA技术的研究,终于大致了解了P2P网络JXTA技术的JAVA语言实现过程,特整理出来,以供大家交流讨论。本文是作者我对JXTA应用的一些个人体会及总结第一步,大家需要下载JXTA的类库,在http://www.jxta.org上可以下载到最新版本。我这里提供JXTA2.4.1的版本(很抱歉,超过限制上传不了!我会在论坛上另外上传,包括CHM格式的技术手册)。
第二步,新建一个JAVA工程,将这些JAR包添加至构建路径(此处是采用Eclipse,用其他IDE,或是直接将这些JAR包添加到CLASSPATH也行)。
第三步,我们将开始代码编写了。新建一个类。其main方法及其调用方法代码如下:
public static void main(String[] args) {
RestoPeer myapp = new RestoPeer(); //此处实例化一个对等体对象。
myapp.startJxta(); //此处启动JXTA方法,用来加入组,获得服务等等。
System.exit(0); //功能至完成,退出系统。
}
public void startJxta() {
try {
//加入默认对等组NetPeerGroup
netpg = new NetPeerGroupFactory().getInterface();
} catch (PeerGroupException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
......
}此处需要注意的是,由于JXTA技术的不断更新,其类库结构和实现已发生很大变化,此处加入默认对等组是2.4.1版本中的新方法。JXTA技术手册上的方法已过时。
第四步,我们需要获得默认对等组为我们提供的发现服务:
DiscoveryService disco = netpggetDiscoveryService();
此时,我们便可以利用disco服务来查找我们所需的广告了。
第五步,我们需要查找一个属于我们自己的对等组,如果找不到,我们则创建一个这样的对等组。此时只是为了得到我们所需要的服务。因为每个对等组里所提供的服务并不全部相同。我们通常会把相同的目的的对等体通过一个对等组来组织起来。一个加入对等组的代码如下:(此例采用JXTA技术手册里的一个餐馆的拍卖服务案例来描述)
// 加入拍卖组
private void joinRestoNet() {
int count = 3; // 试图发现的最高循环次数
System.out.println(" 试图发现组名为 RestoNet 对等组");
从NetPeerGroup获得发现服务
DiscoveryService hdisco = netpg.getDiscoveryService();
Enumeration ae = null; // 记录发现的广告。
// 循环直到我们发现RestoNet对等组或是直到我们达到了试图预期发现的次数。
while (count-- > 0) {
try {
// 第一次搜索对等体的本地缓存来查找RestoNet对等组通告。
// 通过NetPeerGroup组提供的发现服务发现"Name"属性为"RestoNet"的对等组
ae = hdisco.getLocalAdvertisements(DiscoveryService.GROUP,
"Name", "RestoNet");
// 如果发现RestoNet对等组通告,该方法完成,退出循环。
if ((ae != null) && ae.hasMoreElements()) {
break;
}
// 如果我们没有在本地找到它,便发送发现远程请求。
// 参数依次为要查找的对等体ID,为空时不以此为发现条件;发现的通告类型,取值还有PEER,和ADV;
// 要发现的通告属性名称;属性取值;需获取的最大通告数量;发现监听器
hdisco.getRemoteAdvertisements(null, DiscoveryService.GROUP,
"Name", "RestoNet", 1, null);
// 线程暂停一下等待对等体內该发现请求。
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*-------------------------------------------
* 以上为循环发现目标组过程,以下为加入过程
* ----------------------------------------*/
// 创建一个对等组通告引用
PeerGroupAdvertisement restoNetAdv = null;
// 检查我们是否找到RestoNet通告。如果没有找到,表示我们可能是第一个试图加入该组的对等体,
//或是其他知道RestoNet组的对等体成员已经关闭或不可到达
// 万一出现这种情况,我们必须创建一个RestoNet对等组。
if (ae == null || !ae.hasMoreElements()) {
// 如果该组不在,给出提示信息,创建该组
System.out
.println("Could not find the RestoNext peergroup;createing me");
try {
// 创建一个新的对等组RestoNet,全能对等组
// 通过NetPeerGroup获得一个一般对等组的通告。
ModuleImplAdvertisement implAdv = netpg
.getAllPurposePeerGroupImplAdvertisement();
// 通过NetPeerGroup创建一个新的对等组,JXTA会自行发布该对等组通告,
//参数依次为对等组ID,通告,组名,描述
restoNet = netpg.newGroup(mkGroupID(), implAdv, "RestoNet",
"RestoNet,Inc.");
// 获得一个对等组通告
restoNetAdv = netpg.getPeerGroupAdvertisement();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
// RestoNet通告在缓存内找到意味着我们可以加入这个存在的组。
// 在集合中提取一个对等组通告元素
restoNetAdv = (PeerGroupAdvertisement) ae.nextElement();
try {
// 加入该对等组,由于该通告已经发布,JXTA不会再行发布。
restoNet = netpg.newGroup(restoNetAdv);
System.out.println("找到RestoNet对等组,并加入存在的该组");
} catch (PeerGroupException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 获得RestoNet提供的发现服务和管道服务
disco = restoNet.getDiscoveryService();
pipes = restoNet.getPipeService();
System.out.println("RestoNet Restaurant_(" + brand + ") is on-line");
return;
}
此时,我们已经加入或者创建了一个RestoNet对等组了,该组位于NetPerrGroup组内,所以通过NetPeerGroup提供的发现服务可以找到该组广告。如若找不到,则跟网络环境有关,可能是等待时间太短或是循环次数太少,因为P2P网络是不可靠的网络,因此这个参数很难确定,需要根据实际情况来设置。
至此,我们的机器已处于一个P2P网络中了,其实在我们得到默认对等组实例时我们已经在P2P网络中了,只不过我们现在已经通过网络发现,找到或创建了我们需要的对等组并加入其中,以后我们便可以提供并消费该对等组提供的服务或是该对等组内对等体提供的服务了。
以上为最简单的构建P2P网络,加入对等组的简单应用,以后会陆续贴出利用JXTA技术实现普通字符通讯和媒体数据广播等应用。敬请期待!以上所有均为个人实践体会及理解,如若有误,还望不吝赐教进行批评指正,如需交流,请加MSN:setve007@hotmail.com
源代码下载:
日前我发表了一篇关于JXTA技术建立P2P网络的文章,得到了广大朋友们的关注和支持,现应朋友们要求,我将一些测试源码上传上来供大家参考讨论,还望大家多提宝贵意见!需要说明的,在src.rar中的两个文件需要放到不同的工作目录下方可运行成功。因为JXTA第一次运行时会为每个对等体设置缓存目录,如在同一工作区内后者会将前者信息覆盖,因此建议用不同工作区最好是两台电脑来测试。在第一次运行时会弹出一个配置窗口,大家只需填写用户名和密码即可,其他设置暂时不须关心。密码必须大于八位。
另外三个包为JXTA类库,请大家解压后导入项目中即可。
src
本页页面地址:
用户评论列表
good work!抢占沙发!
如果能提供源代码给大家进行学习就更好了。
不知道setve同学是否做过performance测试,jxta的性能令本人心存疑虑。
good work!如果能提供源代码给大家进行学习就更好了。
不知道setve同学是否做过performance测试,jxta的性能令本人心存疑虑。
回复楼上二位,性能测试我就没有做,只是实现通讯功能而已。不过说实在的,Jxta的搜索的确还有问题,经常会出现在局网内部都找不到对等体的情况,这个也跟设置的查找次数和每次等待的延时有关,因为他的网络是通过虚拟管道来的,所以还不是很稳定。这个问题亟待解决。
帅哥,可真辛苦你了,把jar包去掉,然后把源码发上来,一起研究研究的,呵呵
呵呵,性能、稳定都是大问题
很抱歉各位,我没有找到可供上传大文件的位置,手册传不上来,如果有需要的给我邮件吧!
想参考一下你的代码:麻烦发一下,谢谢。
string.tang@gmail.com
建议setve将源代码和binary一起打成分包的rar,这样可以提供给每个人下载参考。如果做好的话,我可以帮助你修改文章上的下载链接。
看到大家关注十分高兴,我稍后便将代码稍做整理,然后分包上传。希望大家在看的同时也能够提出意见或建议,共同讨论学习!
辛苦了, 期待参考你的代码~
实在抱歉,我的代码已经发表快两周了,不知道什么原因,管理员还没有审核批准,让大家久等了!
实在抱歉,我的代码已经发表快两周了,不知道什么原因,管理员还没有审核批准,让大家久等了!
为方便大家交流,我新建了一个QQ群,Jxta社区,如果有研究这方面的朋友请加进来,大家共同学习研究!群里的共享有些我上传的手册和类库!
群号是31814213
感谢聪明的猪帮我找到源码合并文章并修改链接。
想参考一下你的代码,谢谢。
monteux@sina.com.cn
源代碼在上面下就行了!
正在关注java的p2p实现,如何开始研究jxta,期待你的回信
建议楼上找一本JXTA技术手册,理解JXTA中的一些基本概念,然后结合我做过的例子动手实践中,构建网络并通信。有问题可以发我邮箱。
你好,我看了你的“使用JXTA技术建立P2P网络”文章,受益匪浅,同时下载了拍卖的源代码,但运行后总是提示:java.net.URISyntaxException: URI scheme was not as expected.: jxta:uuid-4d6172676572696e204272756e6f202002
不知什么原因,请赐教
给我也发一个吧谢谢了
给我也发一个吧谢谢了
给我也发一个你的原代码吧谢谢了我的邮箱是taowenbiao@126.com
拜托给我也发个~~我邮箱jackqn@126.com~~谢谢
拜托给我也发个~~我邮箱hongtao47@hotmail.com ~谢谢
希望获得源码,楼主想法不错,希望能进行交流。
谢谢源码,正在关注中
麻烦你也给我发一个好不好?
我的邮箱是:yhf86@126.com
很好,我的邮箱是aboysun@126.com。帮忙也给我发一个吧
我也想要一份,我的邮箱是fengexi@sohu.com,帮忙也给我发一个吧
我也想要一份,我的邮箱是cjc19762338@qq.com,帮忙也给我发一个吧
我也想要一份,我的邮箱是cjc19762338@qq.com,帮忙也给我发一个吧
你好,我看了你的“使用JXTA技术建立P2P网络”文章,受益匪浅,同时下载了拍卖的源代码,但运行后总是提示:java.net.URISyntaxException: URI scheme was not as expected.: jxta:uuid-4d6172676572696e204272756e6f202002
不知什么原因,请赐教
你好,我看了你的“使用JXTA技术建立P2P网络”文章,受益匪浅,同时下载了拍卖的源代码,但运行后总是提示:java.net.URISyntaxException: URI scheme was not as expected.: jxta:uuid-4d6172676572696e204272756e6f202002
不知什么原因,请赐教
发表我的评论 (评论可增加个人积分...)
| 用户*: | E-mail: | ||
| 评论内容*: 支持BBCode |
|||
| 算术题*: | + = | ||

ICP:?B2-20040367