jxta 组建第一个对等网络

最近,投身到p2p的研究当中。使用的是jxta平台。当中当然是要模索一番,方能进入状态,现总结一下。

概念不说了,直接上代码:

代码分两个类,一个为餐馆类,一个为饥饿者类;

注意,这两个类应放在不同目录下,最好放在不同工程下

餐馆类:

import net.jxta.discovery.DiscoveryService;
import net.jxta.exception.PeerGroupException;
import net.jxta.id.IDFactory;
import net.jxta.peergroup.*;
import net.jxta.pipe.PipeService;
import net.jxta.protocol.ModuleImplAdvertisement;
import net.jxta.protocol.PeerGroupAdvertisement;

import java.io.IOException;
import java.util.Enumeration;

import java.net.*;;

/**
*
* 这个类代表一个餐馆,准备建立一个叫 usernpg 的对等组
* 如果 usernpg 对等组已经建立,则直接加入
* @author haiyusimon
*
*/
public class First {
/*
* 一些参数的定于
*/
private PeerGroup npg = null;
private PeerGroup usernpg = null;
Enumeration ae = null; //装载发现的 peers
DiscoveryService discovs;

/*
* main函数
*/
public static void main(String args[]) {
System.out.println("Strarting...");
First f = new First();
f.startJXTA();
System.exit(0);
}

public void startJXTA() {
try {
npg = new NetPeerGroupFactory()
.getInterface(); //加入总的组,每一个jxta的peer都必须加入这个组
} catch (PeerGroupException e) {
System.out.println("加入组失败!");
}
/*
* 随便打印一些东西,了解一下这个组的属性
*/
System.out.println(npg.getPeerGroupName());
System.out.println(npg.getPeerGroupID());
System.out.println(npg.getPeerID());
System.out.println(npg.getPeerName());
//开始寻找加入组
joinUsernpg();
}

/*
*这个方法是实现加入组的过程
*/
private void joinUsernpg() {

int count = 3; //尝试发现组的循环次数
System.out.println("Staring discovery the usernpg!");
discovs = npg.getDiscoveryService(); //从总的组取得发现服务
// 开始寻找
while(count-->0) {
try {
ae = discovs.getLocalAdvertisements
(DiscoveryService.GROUP, "Name", "usernpg");//寻找名字为 usernpg 的组的广告,并把它放入枚举内
if( (ae !=null) && ae.hasMoreElements()) {
//boolen ae.hasMoreElements() 测试测试此枚举是否包含更多的元素。
System.out.println("发现组");
break;
}
//通过边缘点发现组
discovs.getRemoteAdvertisements(null, DiscoveryService.GROUP, "Name","usernpg", 1,null);
long timeout = 2000;
//睡眠以后等待节点响应
//应该根据peer所处网络环境设定等待时间,如果该地区节点稀少,则相应设长的
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}

PeerGroupAdvertisement usernpgAdv = null;
//没有发现组的通告,建立一个并加入
if ((ae == null) || !ae.hasMoreElements()) {
System.out.println("没有发现组,我会现在创建一个组");
try {
ModuleImplAdvertisement impAdv = npg.getAllPurposePeerGroupImplAdvertisement();
usernpg = npg.newGroup(mkGroupID(),impAdv,"usernpg","usernpg,video.inc");
usernpgAdv = usernpg.getPeerGroupAdvertisement();
System.out.println("我创建组成功!");
} catch (Exception e) {
e.printStackTrace();
}
}else{//发现组的通告的情况
usernpgAdv = (PeerGroupAdvertisement)ae.nextElement();//在该枚举里查找该通告
try {
usernpg = npg.newGroup(usernpgAdv);
System.out.println("找到组的通告,加入该组");
//随便打印一些东西,了解一下自己创建这个组的属性
System.out.println(usernpg.getMembershipService());
System.out.println(usernpg.isRendezvous());
System.out.println(usernpg.WK_ID_PREFIX);
System.out.println(usernpg.Here);
System.out.println(usernpg.Both);
} catch (PeerGroupException e) {
e.printStackTrace();
}
/*
* 以下是加入组后取得该组的发现服务和管道服务,为以后创建管道进行通信使用
* 不要用总的组来取得相关服务,这会大大增加
* 以后的发现时间而且pipes会出现空指针错误
*/
discovs = usernpg.getDiscoveryService();
PipeService pipes = usernpg.getPipeService();
}
}

private PeerGroupID mkGroupID() throws URISyntaxException {//返回GroupID
String groupURL = "jxta:uuid-AAA122616461AAAAAAA124615032503302";
return (PeerGroupID) IDFactory.fromURI(new URI("urn"+":"+groupURL));
}
}

饥饿者类:

import net.jxta.discovery.DiscoveryService;
import net.jxta.exception.PeerGroupException;
import net.jxta.id.IDFactory;
import net.jxta.peergroup.*;
import net.jxta.pipe.PipeService;
import net.jxta.protocol.ModuleImplAdvertisement;
import net.jxta.protocol.PeerGroupAdvertisement;

import java.io.IOException;
import java.util.Enumeration;

import java.net.*;;
/**
* 饥饿者类
* @author haiyusimon
*
*
*/
public class Hugery {

private PeerGroup npg = null;
private PeerGroup usernpg = null;
Enumeration ae = null; //装载发现的 peers
DiscoveryService discovs;

public static void main(String args[]) {
System.out.println("Strarting...");
First f = new First();
f.startJXTA();
System.exit(0);
}

public void startJXTA() {
try {
npg = new NetPeerGroupFactory()
.getInterface();//一样先加入总的组
} catch (PeerGroupException e) {
System.out.println("加入组失败!");
}
System.out.println(npg.getPeerGroupName());
System.out.println(npg.getPeerGroupID());
System.out.println(npg.getPeerID());
System.out.println(npg.getPeerName());
joinUsernpg();
}

private void joinUsernpg() {
int count = 20; //尝试发现组的循环次数
System.out.println("Staring discovery the usernpg!");
discovs = npg.getDiscoveryService();
//寻找餐馆过程,通过通告寻找
while(count-->0) {
try {
ae = discovs.getLocalAdvertisements(DiscoveryService.GROUP, "Nam", "usernpg");
if( (ae !=null) && ae.hasMoreElements()) { //boolen ae.hasMoreElements() 测试测试此枚举是否包含更多的元素。
System.out.println("发现组");
break;
}
//边缘地区也寻找一下节点通告
discovs.getRemoteAdvertisements(null, DiscoveryService.GROUP, "Name","usernpg", 1,null);
long timeout = 2000;
//睡眠以后等待节点响应
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}


PeerGroupAdvertisement usernpgAdv = null;
//找不到餐馆的情况
if ((ae == null) || !ae.hasMoreElements()) {
System.out.println("没有发现组!!");
System.exit(0);
}else{//找到餐馆的情况
usernpgAdv = (PeerGroupAdvertisement)ae.nextElement();//在该枚举里查找该通告
try {
usernpg = npg.newGroup(usernpgAdv);
System.out.println("找到组的通告,加入该组");
} catch (PeerGroupException e) {
e.printStackTrace();
}

/*
* 同样以下是加入组后取得该组的发现服务和管道服务,为以后创建管道进行通信使用
* 不要用总的组来取得相关服务,这会大大增加
* 以后的发现时间而且pipes会出现空指针错误
*/
discovs = usernpg.getDiscoveryService();
PipeService pipes = usernpg.getPipeService();
}
}

private PeerGroupID mkGroupID() throws URISyntaxException {//确保不同对等体生成相同的ID的对等组
String groupURL = "jxta:uuid-AAA122616461AAAAAAA124615032503302";
return (PeerGroupID) IDFactory.fromURI(new URI("urn"+":"+groupURL));
}
}

分别运行两个类,如果最后都成加入了usernog组,则我们以建立简单p2p网络

你可能感兴趣的:(thread,.net,F#)