`

如何从HelloWorld开始学习JXTA

阅读更多

本文主要从代码来讲解从HelloWorld开始理解和学习JXTA。在这里我们要实现的是一个Peer如何发现对等组并加入,如果不存在,则创建。当然在这里的加入对等组是最简单的,没有加入任何认证。这样是不安全和不利于对PeerGroup管理的。不过我们在这里只是要了解一下Peer的加入对等组的过程。在这里我用到的是JXTA版本是2.4.1。

public class HelloWorld {

 private PeerGroup netgroup = null;

 private Enumeration ae = null; // 记录发现的对等体广告。

 public static void main(String[] args) {
  HelloWorld myapp = new HelloWorld();
  myapp.startJxta();
  System.exit(0);
 }

 public void startJxta() {
  try {
   netgroup = new NetPeerGroupFactory().getInterface();
   
  } catch (PeerGroupException e) {
   e.printStackTrace();
  }
  // 从NetPeerGroup获得发现服务
  DiscoveryService hdisco = netgroup.getDiscoveryService();
  ae = findPeerGroup(hdisco, "Name", "HelloWorld");
  if (ae != null && ae.hasMoreElements()) {
   System.out.println("找到HelloWorld对等组");
   joinPeerGroup(netgroup, (PeerGroupAdvertisement) ae.nextElement());//找到目标对等组,加入
   System.out.println("加入HelloWorld对等组成功!!!");
  } else {
   System.out.println("没有找到HelloWorld对等组,则创建,在创建中......");
   createNewPeerGroup(netgroup, "HelloWorld", "HelloWorld,Inc");//没有找到目标对等组,创建
   System.out.println("创建HelloWorld对等组成功!!!");
  }
  System.exit(-1);
 }

 private Enumeration findPeerGroup(DiscoveryService dis, String key,
   String name) {
  int count = 3; // 试图发现的最高次数
  int timeout = 3000;
  Enumeration advs = null;
  // 循环直到我们发现helloWorld对等组或是直到我们达到了试图预期发现的次数。
  while (count-- > 0) {
   try {
    // 第一次搜索对等体的本地缓存来查找helloWorld对等组通告。
    // 通过NetPeerGroup组提供的发现服务发现"Name"属性为"helloWorld"的对等组
    advs = dis.getLocalAdvertisements(DiscoveryService.GROUP, key,
      name);
    // 如果发现helloWorld对等组通告,该方法完成,退出循环。
    if ((advs != null) && advs.hasMoreElements()) {
     break;
    }
    // 如果我们没有在本地找到它,便发送发现远程请求。
    // 参数依次为要查找的对等体ID,为空时不以此为发现条件;发现的通告类型,取值还有PEER,和ADV;
    // 要发现的通告属性名称;属性取值;需获取的最大通告数量;发现监听器
    dis.getRemoteAdvertisements(null, DiscoveryService.GROUP, key,
      name, 1, null);
    // 线程延时一下等待对等体內该发现请求。
    try {
     Thread.sleep(timeout);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return advs;
 }

 // 如果不存在目标对等组,则创建目标对等组
 private PeerGroup createNewPeerGroup(PeerGroup netpg, String name,
   String desc) {
  PeerGroup result = null;
  try {
   // 创建一个新的对等组helloWorld
   // 通过NetPeerGroup获得一个一般对等组的通告。
   ModuleImplAdvertisement implAdv = netpg
     .getAllPurposePeerGroupImplAdvertisement();
   // 通过NetPeerGroup创建一个新的对等组,JXTA会自行发布该对等组通告,
   // 参数依次为对等组ID,通告,组名,描述
   result = netpg.newGroup(IDFactory.newPeerGroupID(), implAdv, name,
     desc);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return result;
 }

 // 加入对等组
 private PeerGroup joinPeerGroup(PeerGroup netpg,
   PeerGroupAdvertisement pgAdv) {
  PeerGroup result = null;
  try {
   // 加入该对等组,由于该通告已经发布,JXTA不会再行发布。
   result = netpg.newGroup(pgAdv);
  } catch (PeerGroupException e) {
   e.printStackTrace();
  }
  return result;
 }
}

当我们第1次运行时,会跳出出配置UI,我们在这里只要输入PeerName和Password,再点击OK,就可以啦。

运行代码,我们可能发现,只是在后台看到一些重要的过程的输入,到底有没有加入,Peer,PeerGroup的信息也没有。会有点不爽,不过在这里我要讲的这个过程。没有打印出Peer和PeerGroup的信息。因为发现资源,我们会用到DiscoveryService,后续会慢慢给出这些代码。

3
1
分享到:
评论
4 楼 ariestiger 2010-11-17  
public class HelloWorld {
 private PeerGroup netgroup = null;
 private Enumeration ae = null; // 记录发现的对等体广告。
 public static void main(String[] args) {
  HelloWorld myapp = new HelloWorld();
  myapp.startJxta();
  System.exit(0);
 }
 public void startJxta() {
  try {
   netgroup = new NetPeerGroupFactory().getInterface();
   
  } catch (PeerGroupException e) {
   e.printStackTrace();
  }
  // 从NetPeerGroup获得发现服务
  DiscoveryService hdisco = netgroup.getDiscoveryService();
  ae = findPeerGroup(hdisco, "Name", "HelloWorld");
  if (ae != null && ae.hasMoreElements()) {
   System.out.println("找到HelloWorld对等组");
   joinPeerGroup(netgroup, (PeerGroupAdvertisement) ae.nextElement());//找到目标对等组,加入
   System.out.println("加入HelloWorld对等组成功!!!");
  } else {
   System.out.println("没有找到HelloWorld对等组,则创建,在创建中......");
   createNewPeerGroup(netgroup, "HelloWorld", "HelloWorld,Inc");//没有找到目标对等组,创建
   System.out.println("创建HelloWorld对等组成功!!!");
  }
  System.exit(-1);
 }
 private Enumeration findPeerGroup(DiscoveryService dis, String key,
   String name) {
  int count = 3; // 试图发现的最高次数
  int timeout = 3000;
  Enumeration advs = null;
  // 循环直到我们发现helloWorld对等组或是直到我们达到了试图预期发现的次数。
  while (count-- > 0) {
   try {
    // 第一次搜索对等体的本地缓存来查找helloWorld对等组通告。
    // 通过NetPeerGroup组提供的发现服务发现"Name"属性为"helloWorld"的对等组
    advs = dis.getLocalAdvertisements(DiscoveryService.GROUP, key,
      name);
    // 如果发现helloWorld对等组通告,该方法完成,退出循环。
    if ((advs != null) && advs.hasMoreElements()) {
     break;
    }
    // 如果我们没有在本地找到它,便发送发现远程请求。
    // 参数依次为要查找的对等体ID,为空时不以此为发现条件;发现的通告类型,取值还有PEER,和ADV;
    // 要发现的通告属性名称;属性取值;需获取的最大通告数量;发现监听器
    dis.getRemoteAdvertisements(null, DiscoveryService.GROUP, key,
      name, 1, null);
    // 线程延时一下等待对等体內该发现请求。
    try {
     Thread.sleep(timeout);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return advs;
 }
 // 如果不存在目标对等组,则创建目标对等组
 private PeerGroup createNewPeerGroup(PeerGroup netpg, String name,
   String desc) {
  PeerGroup result = null;
  try {
   // 创建一个新的对等组helloWorld
   // 通过NetPeerGroup获得一个一般对等组的通告。
   ModuleImplAdvertisement implAdv = netpg
     .getAllPurposePeerGroupImplAdvertisement();
   // 通过NetPeerGroup创建一个新的对等组,JXTA会自行发布该对等组通告,
   // 参数依次为对等组ID,通告,组名,描述
   result = netpg.newGroup(IDFactory.newPeerGroupID(), implAdv, name,
     desc);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return result;
 }
 // 加入对等组
 private PeerGroup joinPeerGroup(PeerGroup netpg,
   PeerGroupAdvertisement pgAdv) {
  PeerGroup result = null;
  try {
   // 加入该对等组,由于该通告已经发布,JXTA不会再行发布。
   result = netpg.newGroup(pgAdv);
  } catch (PeerGroupException e) {
   e.printStackTrace();
  }
  return result;
 }
}
3 楼 lifeng_2009 2010-06-02  
你好,我想请教个问题,我自己写了个小例子
在服务器创建了个PeerGroup 本机通过newGroup加入PeerGroup 
但是用这个组创建的PipeAdvertisement
 pids = myGroup.getDiscoveryService();
PipeAdvertisement piadv = (PipeAdvertisement)AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType());
piadv.setPipeID(IDFactory.newPipeID(myGroup.getPeerGroupID()));
			piadv.setName("myPipeAdv");
			piadv.setDescription("new a PipeAdvertisement");
			piadv.setType(PipeService.UnicastType);

try {
				pids.publish(piadv,PeerGroup.DEFAULT_LIFETIME,PeerGroup.DEFAULT_EXPIRATION);
				pids.remotePublish(piadv,DiscoveryService.ADV);
				System.out.println("创建管道广告并发布!");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

远程(内网机器-服务器)却搜索(getRemoteAdvertisements)不到
但是 两个PEER 都用默认组
PeerGroup netGP = (new NetPeerGroupFactory()).getInterface();
的话就可以搜索的到 请问这个是什么原因啊 麻烦了
2 楼 lyndon.lin 2010-05-01  
需要固定的网络IP,及你已知的一个RDV,具有Http通信及路由的功能。因为我也没有做过跨网络的。呵呵。
1 楼 Michael_Jaychao 2010-05-01  
请教牙哥,在jxta平台上,如何实现跨网络防火墙的服务,指导书上说需要设置浏览器的局域网设置,没有具体介绍,

相关推荐

    JXTA-HelloWorld.rar_jxta

    描述中的"JXTA的 HelloWorld程序,教你如何初次学习JXTA"进一步确认了这是一个面向初学者的教学资源。通过分析这个Hello World程序,我们可以了解JXTA的基本用法,包括设置对等节点,创建通道,发送和接收消息等步骤...

    jxta-myjxta-docs-2.4.1_helloworld_

    《JXTA与MyJXTA 2.4.1:HelloWorld教程详解》 ...通过深入学习和实践这个HelloWorld教程,开发者不仅能掌握JXTA和MyJXTA的基础,还能建立起对P2P网络编程的直观理解,为后续开发更复杂的P2P应用程序打下坚实的基础。

    jxta.rar_jxta

    总结,"jxta.rar_jxta"这个压缩包可能是一个学习JXTA P2P编程的资源,其中的"HelloWorld"实例将引导用户熟悉JXTA的基本概念和操作流程,涉及JXTA的初始化、服务广告、发现、连接建立以及数据交换等核心功能。...

    JXTA2.5技术手册

    - **Hello World示例**:最简单的入门程序,展示了如何创建一个基本的JXTA Peer。 - **本地配置示例**:演示如何管理和配置本地Peer的设置。 #### 四、JXTA中的关键技术点 - **ID(标识符)**: 用于唯一标识Peer或...

    安卓项目源代码

    7. **社交网络应用**:HelloWorld goes mobile是将社交网络功能融入安卓应用的一个实例,可以学习如何集成社交API,实现登录、发布动态等功能。 8. **聊天程序**:如jChat,它演示了如何实现实时通讯功能,包括网络...

    从Java走向Java+EE+.rar

    17.3 实例——分布式的HelloWorld 260 17.4 小结 264 第18章 Java消息服务 265 18.1 消息系统和JMS 265 18.1.1 JMS API 265 18.1.2 点对点消息模式 266 18.1.3 发布者/订阅者模式 267 18.1.4 同步和...

    Android 近百个项目的源代码.doc

    6. **社交网络应用**:HelloWorld goes mobile演示了如何构建基本的社交网络应用,包括登录、数据交换和用户界面设计。 7. **聊天应用**:jChat4android展示了如何实现即时通讯功能,包括消息传输、在线状态管理和...

    java基于jxt的excel下载

    Java中的JExcelAPI(简称JXTA)是一个用于读写Microsoft Excel文件的开源库,而题目中提到的“java基于jxl的excel下载”实际上可能是笔误,因为正常情况下我们用JExcelAPI来读写Excel,而不是下载。不过,我们可以...

Global site tag (gtag.js) - Google Analytics