还是先用一个例子来说明吧!:)这个例子用来说明怎样发现网络上的其他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。  
 
  |