Java

本类阅读TOP10

·使用MyEclipse开发Struts框架的Hello World!(录像1)
·hibernate配置笔记
·AOP编程入门--Java篇
·linux下Tomcat 5.0.20 与 Apache 2 安装/集成/配置
·在win2003下整合了整合Tomcat5.5+ apache_2.0.53+ mod_jk_2.0.47.dll
·构建Linux下IDE环境--Eclipse篇
·Jsp 连接 mySQL、Oracle 数据库备忘(Windows平台)
·ASP、JSP、PHP 三种技术比较
·Tomcat5.5.9的安装配置
·AWT GUI 设计笔记(二)

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
JXTA核心协议之对等机发现协议(PDP)(三)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

还是先用一个例子来说明吧!:)这个例子用来说明怎样发现网络上的其他JXTA Peers。
11.应用实例
Source Code: DiscoveryDemo.java
 
1   import java.util.Enumeration;
2   import net.jxta.discovery.*;
3   import net.jxta.exception.*;
4   import net.jxta.peergroup.*;
5   import net.jxta.protocol.*;
6  
7   public class DiscoveryDemo implements Runnable, DiscoveryListener {
8  
9      static PeerGroup netPeerGroup = null;
10      private DiscoveryService discovery;
11 
12      // 开始配置JXTA平台
13      private void startJxta() {
14          try {
15              netPeerGroup = PeerGroupFactory.newNetPeerGroup();
16          }catch ( PeerGroupException e) {
17 
18              //如果不能实例化Peer Group,输出原因并结束程序。
19              System.out.println("Fatal error : group creation failure");
20              e.printStackTrace();
21              System.exit(1);
22          }
23
24      //从Peer Group中发现的服务器
25      discovery = netPeerGroup.getDiscoveryService();
26      }
27
28      // 线程将每分钟循环一次,直到发现Peers为止,并显示找到的结果
29 
30      public void run() {
31          try {
32              // 为 DiscoveryResponse events 添加 DiscoveryListener
33              discovery.addDiscoveryListener(this);
34
35              while (true) {
36                  System.out.println("Sending a Discovery Message");
37                  // 寻找Peers,每个Peer最多反馈5个 。
38                  discovery.getRemoteAdvertisements(null, DiscoveryService.PEER,
39                                                      null, null, 5);
40
41                  // 等待一分钟
42                  try {
43                      Thread.sleep(60 * 1000);
44                  } catch(Exception e) {}
45
46              }
47          } catch(Exception e) {
48              e.printStackTrace();
49          }
50      }
51
52      // 为了实现 DiscoveryListener,我们必须定义这个方法来处理所反馈信息
53
54      public void discoveryEvent(DiscoveryEvent ev) {
55
56          DiscoveryResponseMsg res = ev.getResponse();
57          String name = "unknown";
58
59          // 获得Peers的反馈广告
60          PeerAdvertisement peerAdv = res.getPeerAdvertisement();
61 
62          // 一些Peers不能反馈他们的 PeerAdvertisement
63          if (peerAdv != null) {
64              name = peerAdv.getName();
65          }
66 
67          System.out.println ("Got a Discovery Response [" +
68                  res.getResponseCount()+ " elements] from peer : " +
69                              name);
70
71          // 输出发现的Peer
72          PeerAdvertisement adv = null;
73          Enumeration enum = res.getAdvertisements();
74
75          if (enum != null ) {
76              while (enum.hasMoreElements()) {
77                  adv = (PeerAdvertisement) enum.nextElement();
78                  System.out.println (" Peer name = " + adv.getName());
79              }
80          }
81      }
82
83      static public void main(String args[]) {
84          DiscoveryDemo myapp = new DiscoveryDemo();
85          myapp.startJxta();
86          myapp.run();
87      }
88  }
 
一个JXTA Peer 用getLocalAdvertisements()方法来检索本地缓存中的Advertisements,如果想发现其他的Advertisements,就必须用getRemoteAdvertisements(),来发送一个Discovery Query Message给别的Peers。Discovery Query Messages能发送给一个Peer,但也能发送到一个JXTA的网络上。在J2SE的平台上,Discovery Query Messages还可以发给一个rendezvous。如果这个Peer还没有连接到这个rendezvous上,那么Discovery Query Message将只有通过多次的尝试发送到本地的子网。一旦这个Peer已经连接上了一个rendezvous,那么Discovery Query Message也将被传送给这个rendezvous peer。一个Peer在Discovery Query Message里包括它自己的广告,完成一个公告或者是自动的发现机制。
有两个方法来接收DiscoveryResponse Message,你可以等候一个或多个Peer来响应DiscoveryResponse Message,并且调用方法getLocalAdvertisements()来检索已经被发现的任何结果,并添加到本地的缓存中的广告。添加一个Discovery Listener来通知发现的Peer,当discovery events被接收时,调用discoveryEvent()方法。这里有两个方法添加Discovery Listener,一个是直接的addDiscoveryListener()(参考本程序Line33),另一个是通过getRemoteAdvertisements()方法。本例用的是第一种方法,如果采用第二种方法,可以将下程序的Line38~39写成:
discovery.getRemoteAdvertisements(null, DiscoveryService.PEER,null,null,5,this);
并去掉Line33行程序即可。
如果你在运行上面的程序时,没有收到任何的Discovery Response,L!你很有可能没有正确的配置好你的JXTA平台环境。请删除.jxta目录下的PlatformConfig文件,并重新运行程序。
 
12.小结
    本文讲述了JXTA平台如何处理发现其他Peer的有关事宜以及JXTA的Java参考实现中提供的如何给其他Peer发送Discovery请求消息并处理返回的响应。还提到了利用Java参考实现中提供的Discovery接口及实现如何在本地或远程发布Advertisement。
当然,上面所介绍的PDP只是JXTA核心协议的一部分,还有的一些协议将在以后的文章中再介绍,呵呵……:)
 
注:在JXTA里,Advertisement(广告)相当于人类社会中的名片,在JXTA网络中的所有资源都通过广告来描述,用XML语言来描述Advertisement。



相关文章

相关软件