p2p编程:JXTA P2P编程技术例程(2)来源: 发布时间:星期三, 2008年12月17日 浏览:2次 评论:0
创建和发布通告
就如我们早先说那样JXTA虚拟网络依靠JXTA ID 去鉴别网络资源而这些资源发现是通过通告net.jxta.id包 包含了ID类 同事包含了创建各种ID工厂(factory) 在JXTA中 net.jxta.document.Document是个数据通用容器个在JXTA中文档被MIME媒体类型内容所定义这样文档就类似于HTTP流(stream JXTA并不尝试去解释文档内容:这个内容是个应用层协议部分) 个通告是由个类似于XML结构化文档可嵌套多层元素组成StructuredDocument它可以使个文档在它数据没有物理表示(physical representation)时候被操作 就如和其他任何StructureDocument样个通告可以被XML或者简单文本格式表所表示个通告包括它所要通告资源ID 通告类型 以及过期时间绝对值 JXTA API提供个方便工厂 AdvertisementFactory 来创建各种通告类型 Listing 16.3 介绍说明了个ModuleClassAdvertisement通过这个工厂创建注意ModuleClassID被加入到通告中方式) Listing 16.3 Creating and Advertising a Module Class private void doAdvertise { ModuleClassAdvertisement Ad = (ModuleClassAdvertisement)AdvertisementFactory.Advertisement( ModuleClassAdvertisement.getAdvertisementType); ModuleClassID ID = IDFactory.ModuleClassID; Ad.ModuleClassID(ID); Ad.Name(ServiceConstants.CLASS_NAME); Ad.Description("A prime number crunching service."); try { discoSvc.publish(Ad, DiscoveryService.ADV); discoSvc.remotePublish(Ad, DiscoveryService.ADV); .out.prln("Published module adv."); } catch (IOException e) { .out.prln("Trouble publishing module adv: " + e.getMessage); } JXTA net.jxta.discovery.DiscoveryService是个Net Peer Group 提供组服务(group service) 它提供发布发现本科和远程2种模式本地模式在Peer本地缓冲中去发现通告 本地发布就是让通告放入本地缓冲中远程就是在整个peer组中去发现和发布因此请求消息通过JXTA虚拟网络在我们早先描述协议情况下进行传播在它们到底时候就对这些请求进行回应 因此远程发现是个异步过程找到在网络上所要通告类型也需要定时间Listing16.3介绍说明ModuleClassAdvertisement远程和本地2种发布方式 类型前面过程我们通过IDFactory类创建个ModuleSpec ID 并从AdvertisementFactory获得和它相应通告(见listing 16.4) Listing 16.4 Creating a New ModuleSpecAdvertisement ModuleSpecAdvertisement specAd = (ModuleSpecAdvertisement)AdvertisementFactory.Advertisement( ModuleSpecAdvertisement.getAdvertisementType); ModuleSpecID specID = IDFactory.ModuleSpecID(ID); specAd.ModuleSpecID(specID); specAd.Name(ServiceConstants.SPEC_NAME); specAd.Description("Specication for a prime number crunching service"); specAd.Creator("Sams Publishing"); specAd.SpecURI("http://www.samspulishing.com/p2p/primecruncher"); specAd.Version("Version 1.0"); 我们应该记得ModuleSpecAdvertisement定义了个电报协议或者说是个网络行为来访问个服务因此我们需要提供个PipeAdvertisement 作为个到ModuleSpecAdvertisement参数 module通告将被放在网络上peer缓冲的中 那么我们必须确认每个ModuleSpecAdvertisement 在同个PIPE中 这样我们必须将PIPE通告到永久存储器并且在创建新管道时候直从这个存储器中读取数据(如果这个通告没有被存储到磁盘 那么重新创建个新) Listing 16.5 Creating a Pipe Advertisement PipeAdvertisement pipeAd = null; try { FileInputStream is = FileInputStream(PIPE_ADV_FILE); pipeAd = (PipeAdvertisement)AdvertisementFactory. Advertisement( MimeMediaType("text/xml"), is); is.close; } catch (IOException e) { pipeAd = (PipeAdvertisement)AdvertisementFactory. Advertisement( PipeAdvertisement.getAdvertisementType); PipeID pid = IDFactory.PipeID(group.getPeerGroupID); pipeAd.PipeID(pid); //save pipeAd in file Document pipeAdDoc = pipeAd.getDocument( MimeMediaType ("text/xml")); try { FileOutputStream os = FileOutputStream(PIPE_ADV_FILE); pipeAdDoc.sendToStream(os); os.flush; os.close; .out.prln("Wrote pipe advertisement to disk."); } catch (IOException ex) { .out.prln("Can't save pipe advertisement to file " + PIPE_ADV_FILE); .exit(-1); } } 下面代码段在磁盘上保存个管道广告为XML格式 例如运行这个代码得到后面XML文档 <?xml version="1.0"?> <!DOCTYPE jxta:PipeAdvertisement> <jxta:PipeAdvertisement xmlns:jxta="http://jxta.org"> <Id> urn:jxta:uuid-59616261646162614E5047205032503382CCB236202640F5A242ACE15A8F9D7C04 </Id> <Type> JxtaUnicast </Type> </jxta:PipeAdvertisement> 随后我们将PipeAdvertisement 作为个参数传到ModuleSpecAdvertisement如Listing 16.6 Listing 16.6 Adding the PipeAdvertisement as a Parameter to the ModuleSpecAdvertisement specAd.PipeAdvertisement(pipeAdv); 这时我们已经准备好将ModuleSpecAdvertisement发布到本地和远程了 Listing 16.7 Local and Remote Publishing of a ModuleSpecAdvertisement try { discoSvc.publish(specAd, DiscoveryService.ADV); discoSvc.remotePublish(specAd, DiscoveryService.ADV); .out.prln("Published module spec adv"); } catch (IOException e) { .out.prln("Trouble publishing module spec adv: " + e.getMessage); } (在listing 16.8中我们最终在这个管道通告上建立了个InputPipe Listing 16.8 InputPipe Creation from a PipeAdvertisement //create an input pipe based _disibledevent= null) { processInput(highInt, lowInt); } } } 就如以前说net.jxta.endpo.Message对象被EndpoService送到2个peer的间) (个消息包括了套MessageElements 介绍说明了个目地使它路径通过JXTA网络更加方便个消息元素可以是任何字节 消息也包括以串方式提取元素能力 当个新消息元素被指明时候 它可以和个MIME类型相关联就如个作为元素值串在这个思路方法实现中我们参考ServiceConstants.HIGH_INT 和 ServiceConstants.LOW_INT键值提取消息元素 如果这2个元素都是有效串我们将他们传入个私有思路方法中:processInput processInput对执行这个算法起作用 产生个包括所有质数列表(在LOW_INT 和HIGH_INT 的间) 为了节约空间我们不会将这个部分代码写在这里 0
相关文章
读者评论
发表评论 |