最近,投身到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网络
分享到:
相关推荐
P2P优秀论文_一个建立在JXTA平台上的对等网络游戏框架的设计
JXTA协议设计初衷是为了构建一个开放式的对等网络(Peer-to-Peer,P2P),允许任何设备在网络中平等交流,无需中心服务器干预,从而实现高效、灵活的资源共享。然而,直接将JXTA应用于Symbian平台,尤其是在资源有限...
1. **对等节点(Peers)**:在网络中的每一个参与者都是一个对等节点,它们拥有相同的地位,可以互相提供服务或交换信息。 2. **边缘网络(Edge Network)**:JXTA网络是由无数个分散的对等节点组成的,这些节点...
1. **边缘(Edge)**: JXTA网络的边界,由参与网络交互的设备或应用程序组成,每个边缘节点都有一个唯一的标识符(Peer ID)。 2. **管道(Pipe)**: 管道是JXTA中的通信通道,用于对等方之间的数据传输。它们可以...
其次,JXTAShell作为JXTA的重要工具,是一个用于管理、配置和调试JXTA网络的命令行接口。书中将详细阐述如何使用JXTAShell,包括如何启动和停止网络节点,查看网络状态,以及配置和管理P2P服务。熟练运用JXTAShell能...
**JXTA (Java eXtensible Peer-to-Peer Technology)** 是一个开源的、基于Java的平台,专门设计用于构建对等网络(P2P)应用程序。它提供了一组标准的API,允许开发者创建分布式系统,其中每个节点既是客户端也是...
这段代码实例化了一个对等体对象,并通过`startJxta()`方法启动JXTA,加入默认的对等组。 4. **获取发现服务**:在JXTA中,发现服务允许对等体查找其他对等体或对等组。这一步骤至关重要,因为它提供了网络内的...
JXTA(JavaXTra P2P)是一项开源的、基于Java的对等计算框架,由Sun Microsystems于2001年推出,旨在构建一个分布式、自组织的对等网络。在"JXTA\jxta-lib-2.4.1.zip"这个压缩包中,包含了开发P2P应用程序所需的多个...
- **对等点(Peers)**:JXTA网络中的基本单元,每个对等点都拥有平等的地位,可以发布、请求或响应服务。 - **边缘服务(Edge Services)**:在P2P网络的边界上运行的服务,它们为对等点提供连接、身份验证和路由等...
《JXTA 2.2 开发文档》是针对Java平台的一个开源项目,它提供了一套框架和协议,用于构建对等网络(P2P)应用程序。JXTA(Java/XML Peer-to-Peer Technology Architecture)旨在使设备之间能够直接通信,无需中心...
1. **JXTA架构**:JXTA的体系结构基于几个关键组件,包括广告(Advertisements)用于发布资源信息,管道(Pipes)作为通信通道,以及对等组(Peer Groups)来组织网络中的节点。理解这些概念对于有效地使用JXTA至关...
JXTA 是一个开放源代码的P2P(对等网络)平台,由Sun Microsystems在2001年推出,旨在提供一种分布式计算模型,允许网络上的设备之间进行通信和协作。这个平台支持多种服务,包括消息传递、资源发现、身份验证和加密...
1. **JXTA初始化**:设置JXTA配置,启动P2P网络,创建一个对等节点。 2. **广告(Advertise)服务**:发布一个服务,例如“HelloWorld”服务,以便其他对等节点能够找到并连接。 3. **发现(Discovery)服务**:查找...
JXTA(Java eXtensible Peer-to-Peer Technology Platform)是Oracle公司开发的一个开源、跨平台的P2P(Peer-to-Peer)框架,它为构建基于对等网络的应用程序提供了一组标准协议和API。JXTA 2.7是这个框架的一个版本...
在命令行中,用户可以输入各种命令进行操作,如`peer start`来启动一个对等节点,`service find`来查找网络上的特定服务,或者`pipe info`来获取管道的详细信息。 **JXTA技术基础** 理解JXTA Shell前,需要了解...
JXTA(Java Xtreme Programming eXchange)是一种基于Java的开放源代码平台,用于构建对等网络(P2P)应用。它允许设备之间直接通信,共享资源和服务,无需中心服务器。这本书"精通JXTA"深入介绍了这一技术,为...
JXTA平台为P2P网络应用提供了协议和一个可编程的平台,支持基于Java的应用程序接口(API),能够实现对等点之间的直接通信。 JXTA的核心构件包括对等点(peer)、对等组(peergroup)、服务(Service)、管道(Pipe...