JXTA, P2P编程技术例程(3)

质数查询客户端
这个客户端的目的是尽可能的将计算量分布到其它PEER上.考虑用户要获得1到10000之间的质数, 一个peer接到这个消息的时候, 它就需要决定要分给几个peer来做这件事情。.因此,它需要不断的去发现那些通告自己有质数服务的peer,并为它们的通告提供一个缓冲来保存. 例如一个peer有另外10个peer和它一起工作, 那么它可能在第一个消息中以1作为LOW_INT, 1000作HIGH_INT, 在另外一个消息中,以1001作为LOW_INT, 2000作为HIGH_INT,以此类推. 最后, 客户端将打开一个管道通往这10个peer,然后分别向他们传输消息。
客户端的skeleton看起和服务端的差不多, 同样是先初始化Net Peer Group,然后获得GROUP的发现服务和管道服务。.
 
Listing 16.10 PrimeClient
package primecruncher;
import net.jxta.peergroup.PeerGroup;
import net.jxta.peergroup.PeerGroupFactory;
import net.jxta.discovery.DiscoveryService;
import net.jxta.discovery.DiscoveryListener;
import net.jxta.discovery.DiscoveryEvent;
import net.jxta.pipe.PipeService;
import net.jxta.pipe.OutputPipe;
import net.jxta.pipe.PipeID;
import net.jxta.exception.PeerGroupException;
import net.jxta.protocol.DiscoveryResponseMsg;
import net.jxta.protocol.ModuleSpecAdvertisement;
import net.jxta.protocol.PipeAdvertisement;
import net.jxta.document.StructuredTextDocument;
import net.jxta.document.MimeMediaType;
import net.jxta.document.TextElement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.id.IDFactory;
import net.jxta.endpoint.Message;
import java.util.Enumeration;
import java.io.StringWriter;
import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
import java.net.UnknownServiceException;
import java.util.HashSet;
import java.util.Set;
public class PrimeClient implements DiscoveryListener {
        private static PeerGroup group;
        private static DiscoveryService discoSvc;
        private static PipeService pipeSvc;
        private OutputPipe outputPipe;
        private Set adverts = new HashSet();
        public PrimeClient() {
        }
        public static void main(String[] argv) {
               Client cl = new Client();
               cl.startJxta();
               cl.doDiscovery();
        }
        public int[] processPrimes(int low, int high) {
        }
        private void startJxta() {
               try {
                       group = PeerGroupFactory.newNetPeerGroup();
                       discoSvc = group.getDiscoveryService();
                       pipeSvc = group.getPipeService();
               } catch (PeerGroupException e) {
                       System.out.println("Can't create net peer group: " +
                               e.getMessage());
                       System.exit(-1);
               }
        }
        private void doDiscovery() {
 
        }
}
虽然PrimePeer的关键责任是通告它自己的服务和处理收到的消息, PrimeClient 同时必须参与到服务发现过程中)
 doDiscovery()方法初始化了服务发现。 首先,peer调查自己缓冲,在质数计算module的说明中去发现与名字属性想匹配的通告
Listing 16.11 Performing Local Discovery
        System.out.println("Starting service discovery...");
        System.out.println("Searching local cache for " +
               ServiceConstants.SPEC_NAME + " advertisements");
        Enumeration res = null;
        try {
                res = discoSvc.getLocalAdvertisements(DiscoveryService.ADV,
                      "Name", ServiceConstants.SPEC_NAME);
        } catch (IOException e) {
               System.out.println("IO Exception.");
        }
        if (res != null) {
               while (res.hasMoreElements()) {
                       processAdv((ModuleSpecAdvertisement)res.nextElement());
               }
}
然后,peer初始化远程通告发现, 远程发现意味着发现请求将在JXTA网络中传播,当合适的通告被发现后, 就发出回应。 因此, 远程发现是一个异步的过程,我们传递DiscoveryListener 作为一个值(argument)到DiscoveryService 的 getRemoteAdvertisements()方法中。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值