还剩7页未读,继续阅读
文本内容:
编程技术例程二jxta p2PJXTA,P2P编程技术例程2作者:yxiong|日期-07-30|字体大中小创立与公布通告就如我们早先说的那样,JXTA虚拟网络依托JXTA ID去鉴别网络资源而这些资源日勺发现包括了ID类,同事包括了创立多种ID的工厂factory是通过通告onet.jxta.id包在JXTA中,net.jxta.document.Document是一种数据通用容器一种在JXTA中的文档被MIME媒体类型的I内容所定义这样,文档就类似于HTTP流streamJXTA并不尝试去解释文档的I内容:这个内容是一种应用层协议的一部分一种通告是由一种类似于XML构造化文档的I可嵌套肚I多层元素构成的J StructuredDocument,它可以使一种文档在它的数据没有物理表达physical representation日勺时候被操作就如和其他任何StructureDocument同样,一种通告可以被XML或者简朴文本格式表所示一种通告包括它所要通告的资源日勺ID,通告的类型,以及过期日勺时间绝对值JXTA API提供一种以便的I工厂,AdvertisementFactory,来创立多种通告类型Listing
16.3阐明了一种ModuleClassAdvertisement通过这个工厂的J创立注意ModuleClassID被加入到通告中的方式Listing
16.3Creating andAdvertising aModule Classprivatevoid doAdvertise{ModuleClassAdvertisement classAd=ModuleClassAdvertisementAdvertisementFactory.newAdvertisementModuleClassAdvertisement.getAdvertisementType;ModuleClassID classID=IDFactory.newModuleClassID;classAd.setModuleClassIDclassID;classAd.setNameServiceConstants.CLASS NAME;classAd.setDescription,ZA primenumber crunchingservice./z;try{discoSvc.publishclassAd,DiscoveryService.ADV;discoSvc.remotePublishclassAd,DiscoveryService.ADV;System,out.printinz,Published module class adv.〃;}catch lOExceptione{System,out.printinz,Trouble publishingmoduleclassadv:〃+e.getMessage;JXTA net.jxta.discovery.DiscoveryService是——种Net PeerGroup提供时组服务groupservice o它提供公布发现本科与远程2种模式当地模式在Peer当地的缓冲中去发现通告,当地公布就是让通告放入当地的缓冲中远程就是在整个peer组中去发现与公布因此,祈求消息通过JXTA虚拟网络在我们早先描述欧I协议的I状况下进行传播,在它们究竟的时候就对这些祈求的I进行回应因此,远程发现是一种异步的I过程,找到在网络上所要的通告类型也需要一定期间Listingl
6.3阐明ModuleClassAdvertisement的|远程与当地2种发布方式类型前面日勺过程,我们通过IDFactory类创立一种ModuleSpec ID,并从AdvertisementFactory获得与它对应的通告见listing
16.4Listing
16.4Creating aNew ModuleSpecAdvertisementModuleSpecAdvertisementspecAd二ModuleSpecAdvertisementAdvertisementFactory.newAdvertisement ModuleSpecAdvertisement.getAdvertisementType;ModuleSpecID specID=IDFactory.newModuleSpecIDclassID;specAd.setModuleSpecIDspecID;specAd.setNameServiceConstants.SPEC_NAME;specAd.setDescription^Specification fora primenumber crunching•〃\service;specAd.setCreator,zSams Publishing;specAd.setSpecURI〃;;specAd.setVersionVersion
1.0〃;我们应当记得ModuleSpecAdvertisement定义了一种电报协议,或者说是一种网络行为,来访问一种服务,因此我们需要提供一种PipeAdvertisement作为一种到ModuleSpecAdvertisement的J参数由于module日勺通告将被放在网络上peer日勺缓冲之中,那么我们必须确认每一种ModuleSpecAdvertisement在同一种PIPE中这样,我们必须将PIPE的通告到永久存储器并且在创立新管道的时候一直从这个存储器中读取数据假如这个通告没有被存储到磁盘,那么重新创立一种新的IListing
16.5Creating aPipe AdvertisementPipeAdvertisementpipeAd=null;try{FilelnputStream is=new Fi1eInputStrearnPIPE ADVFILE;pipeA..PipeAdvertisementAdvertisementFactory.newAdvertisement.new MimeMediaType^text/xml^,is;is.close;}catch lOExceptione{pipeA..PipeAdvertisementAdvertisementFactory.newAdvertisement.PipeAdvertisement.getAdvertisementType;PipelD pid=IDFactory.newPipelDgroup.getPeerGroupID;pipeAd.setPipelDpid;//save pipeAdin fileDocumentpipeAdDoc=pipeAd.getDocumentnew MimeMediaType〃text/xml〃;try FileOutputStreamos=new FileOutputStreamPIPE_ADV_FILE;pipeAdDoc.sendToStreamos;os.flush;os.close;System.out.printinZ/Wrote pipe advertisement todisk.z,;}catch lOExceptionex{System.out.printin,,Can,t savepipeadvertisementto file〃+PIPE_ADV_FILE;System,exit-1;}下面时代码段在磁盘上保留一种管道广告为XML格式,例如,运行这个代码得到背面欧IXML文档xml version=〃
1.0〃?!DOCTYPE jxta:PipeAdvertisementJxta:PipeAdvertisement xmlns:jxta=〃〃〉Idurn:jxta:uuid-596614E3382CCBF5A242ACE15A8F9D7C04/IdTypeJxtaUnicast/Type/jxta:PipeAdvertisement随即我们将PipeAdvertisement作为一种参数传到ModaleSpecAdvertisement,如Listing
16.6Listing
16.6Adding thePipeAdvertisement asa Parameterto theModuleSpecAdvertisementspecAd.setPipeAdvertisementpipeAdv;这时,我们已经准备好将ModuleSpecAdvertisement公布到当地和远程了Listing
16.7Local andRemote Publishingof aModuleSpecAdvertisementtry{discoSvc.publishspecAd,DiscoveryService.ADV;discoSvc.remotePublishspecAd,DiscoveryService.ADV;System.out.printinz,Published module spec adv〃;}catch lOExceptione{System,out.printinZ/Trouble publishingmodulespecadv:〃+e.getMessage;}在listing
16.8中,我们最终在这个管道通告上建立了一种InputPipeListing
16.8InputPipe Creationfrom aPipeAdvertisement//create aninput pipebased onthe advertisementtry{inputPipe=pipeSvc.createlnputPipepipeAd;System,out.printin*Created inputpipe;}catch lOExceptione{System,out.printin Can’.creat.inpu.pipe...e.getMessage.这些是公布一种新的JXTA服务的需要日勺所有环节我们懂得一种module日勺类通告阐明了module在peer组中的I功能:它是一种非常抽象的I概念,有点类似于JAVA的I定义API的|接口,不过不提供实现一种module的阐明通告在另首先又阐明了一种电报协议来访问一个服务在这种状况下,这个电报协议包括了一种能让其他peer能给他发送消息的I InputPipe,正是这些消息包括了需要欧I2个边界数值Processing Messagesfrom anInputPipe从InputPipe里处理消息下一步是实现让质数查询peer处理接受到的消息,我们将操作进来日勺消息、,算出需要的质数序列,并且送出响应Listing
16.9Processing Messageson anInputPipeprivate voidstartService{while true{Message msg=null;try{msg=inputPipe.waitForMessage;}catch InterruptedExceptionex{inputPipe.close;return;String highlnt=msg.getStringServiceConstants.HIGH INT;String lowlnt=msg.getStringServiceConstants.LOW INT;if highlnt!=null||lowlnt!=null{processinputhighlnt,lowlnt;就如此前说日勺,net.jxta.endpoint.Message对象被EndpointService送到2个peer之间一个消息包括了一套MessageElements,阐明了一种目日勺地使它区I途径通过JXTA网络愈加以便一种消息元素可以是任何字节数组,消息也包括以字符串方式提取元素的能力当一种新的消息元素被指明的时候,它可以与一种MIME类型有关联,就如一种作为元素值的字符串在这个措施的实现中,我们参照ServiceConstants.HIGH INT和ServiceConstants.LOW INT的键值提取消息元素,假如这2个元素都是有效的字符串,我们将他们传入一种私有措施中:processinput processinput对执行这个算法起作用,产生一种包括所有质数的I列表在L0W_INT和HIGHJNT之间,为了节省空间,我们不会将这个部分的I代码写在这里。