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