版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[精]JXTA,P2P编程技术例程(4)JXTA,P2P编程技术例程(4)作者:yxiong|曰期:-07-30|字体:大中小广告处理在我們建立了发現监听器之後,它将不停的加入某些新发現的module阐明通告到我們的當地缓冲中。每次processPrimes()措施被调用的時候,客户peer将尝试连接module阐明通告代表的peer,接入到他們的输入通道中,传递一种消息去初始化這個peer的质数发現服务。)這個措施的第一种元素就是决定我們可以委托以工作的peer集合,应當记得一种通告有一种期限限制,因此我們要消除那些不在有效的通告。Publicint[]processPrimes(intlow,inthigh){SetsetCopy=null;synchronized(adverts){SetsetCopy=(Set)adverts.clone();}ArrayListworkingList=newArrayList();ArrayListexpired=newArrayList();longcurrentTime=System.getCurrentTimeMillis();Iteratorit=workingSet.iterator();while(it.hasNext()){ModuleSpecAdvertisementad=(ModuleSpecAdvertisement)it.next();if(ad.getLocalExpirationTime()>currentTime+(2*60*1000)){workingList.addElement(ad);}else{expired.addElement(ad);}}removeExpired(expired);前述的程序段执行了對一种简朴缓冲中被发現的服务的管理,让removeExpired()措施去删除那些過期和即将過期的通告(這裏没有详细阐明removeExpired())。當我們有了一种有效通告的集合之後,我們可以開始對它們進行操作以获得我們需要用来发送消息的管道通告。.注意這個工作的分发是人為的:某些peer也許比其他peer更有能力某些,某些又也許网络连接方面更好些。這些不一样应當在分派工作的時候都被考虑到,实际上,也不會故意把工作分派為過多的片段,由于网络通信時间也許比花在实际计算质数的時间更多。(這個例子的目的是阐明怎么從一种ModuleSpecAdvertisement得到一种管道通告,這样创立一种新的消息,然後怎样通過管道发送一种消息。)Listing16.14展示了這些自然数列是怎样被分為一种一种的子列的,每個子列又能和一种将送往别的peer的消息相對应。消息被插入到一种hash表映射中,映射的键值显示了消息的状态:与否已經发送了,我們与否收到了它的成果,Listing16.14CreatingNewMessagesMapmessageMap=newHashMap();intsize=workingList.size()intmod=high%size;high-=mod;intperPiece=high/size;for(inti=0;i<size;i++){//createanewmessageMessagemsg=pipeSvc.createMessage();msg.setString(ServiceConstants.LOW_INT,low);//lastmessagewillgettocomputeabitmoreif(i==size-1){high=low+perPiece?1+mod;}else{high=low+perPiece-1;}msg.setString(ServiceConstants.HIGH_INT,high);low+=perPiece;//weneithersentthemessage,nordidwegetaresponseStatusMapstatusMap=newStatusMap(false,false);StatusMapstatusMap=newStatusMap(false,false);messageMap.put(statusMap,msg);}StatusMap就是一對布尔值,這裏并没有列出我們的最终一步就是從每個ModuleSpecAdvertisement中提取管道通告,打開每個管道,发送一种消息到那管道,然後将這個消息標识為“已經发送”。应记得一种通告就是一种构造化的文档,类似于XML文档,它能轻易的被转换為一种文本文档然後打印出来,在開发和测试的時候查阅通告的内容是非常有好处的。Listing16.15PrintinganAdvertisementCollectionads=messageMap.values();Iteratorit=ads.iterator();while(it.hasNext()){ModuleSpecAdvertisementad=(ModuleSpecAdvertisement)it.next();//First,printoutModuleSpecadvertisementonstandardoutputStructuredTextDocumentdoc=(StructuredTextDocument)ad.getDocument(newMimeMediaType("text/plain"));try{StringWriterout=newStringWriter();doc.sendToWriter(out);System.out.println(out);out.close();}catch(IOExceptione){}...正如我們先前讨论的,一种StructuredTextDocument类包括了诸多元素,其中一种是一种参数。當我們為我們的服务构造了ModuleSpecAdvertisement的時候,我們将它作為参数進入這個服务的管道通告。這個参数恰好是此外一种StructuredDocument元素,我們可以用操作XML文档同样的措施操纵它。在解析通告的参数元素的過程中,我們首先获得這個通告的ID和类型,通道的ID与URN阐明相统一,在JXTA阐明中有概述,JXTA阐明将管道的特殊鉴定器用128-bit编码,下面是這個URN的一种例子。urn:jxta:uuid-596614E3382CCBF5A242ACE15A8F9D7C04IDFactory类有能力根据每個URN建造一种PipeID對象。這就是我們用pipeID去关联一個pipe通告的机制。Listing16.16WorkingwithAdvertisementParametersStructuredTextDocumentparam=(StructuredTextDocument)ad.getParam();StringpipeID=null;StringpipeType=null;Enumerationen=null;if(param!=null){en=param.getChildren("jxta:PipeAdvertisement");}Enumerationchild=null;if(en!=null){child=((TextElement)en.nextElement()).getChildren();}if(child!=null){while(child.hasMoreElements()){TextElementel=(TextElement)child.nextElement();StringelementName=el.getName();if(elementName.equals("Id")){pipeID=el.getTextValue();}if(elementName.equals("Type")){pipeType=el.getTextValue();}}}if(pipeID!=null||pipeType!=null){PipeAdvertisementpipeAdvert=(PipeAdvertisement)AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType());try{URLpidURL=newURL(pipeID);PipeIDpid=(PipeID)IDFactory.fromURL(pidURL);pipeAdvert.setPipeID(pid);}catch(MalformedURLExceptione){System.out.println("WrongURL:"+e.getMessage());return;}catch(UnknownServiceExceptione){System.out.println("UnknownService:"+e.getMessage());return;}}基于這個PipeAdvertisement,我們目前有能力去构造一种输出管道去连接遠程peer的输入管道了。如Listing16.17,应當记得一种管道是一种單向的沟通渠道,因此我們没有期望從這個管道上获得遠程peer的回执,遠程peer進行一种必要的类似的工作,打開一种管道连接回客户端,然後连同成果一起发回消息。Listing16.17CreatinganOutputPipetry{outputPipe=pipeSvc.createOutputPipe(pipeAdvert,30000);outputPipe.send(msg);System.out.println("Sentmessageonoutputpipe");}catch(IOExceptione){System.out.println("Can'tsendmessagethroughpipe:"+e.getMessage());}}有趣的是,這個管道创立机制是:一种peer也許在发送ModuleSpecAdvertisement和一种客户连接到它之间变化网络身份,虽然如此,這個peer的虚拟身份在JXTA网络上将不會改变,运行時的服务保证被ModuleSpecAdvertisement所通告的管道一直处在连接状态。為了启動应用服务,确定所有的JXTA类都在classpath裏面,然後输入下面這個命令。javaprimecruncher.PrimePeer你也可以运行下面的参数,這些参数容許你饶過JXTA的登入界面。java–Dnet.jxta.tls.principal=USERNAME-Dnet.jxta.tls.password=PASSWORDprimecruncher.PrimePeerBysubs
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育课教学设计
- 2026 学龄前自闭症艺术治疗实操课件
- 江苏省南京市建邺三校联合~2026届中考联考语文试题含解析
- 保健按摩师中级理论考试模拟题
- 企业税务风险管理基本理论基础综述
- 2026春北师大版(2025)七年级下册心理健康第三单元 学习运动会《第七课 多一点坚持》教学设计
- 2026 学龄前自闭症教师社交课件
- 2026年建设工程施工合同合同标的物检验争议解决调解协议
- 2026 学龄前自闭症提升社交课件
- 少先队员代表发言稿
- 2026年深圳市盐田区初三二模语文试卷(含答案)
- 2026年甘肃八年级地生会考真题试卷+答案
- 核心素养导向下的小学五年级英语Unit 3 What would you like 大单元教学设计与实施教案
- 英语河北保定市2026届高三年级第一次模拟考试(保定一模)(4.7-4.9)
- 2022年温州保安员考试官方指定模拟试题及答案全解
- 骨科护理饮食与营养康复
- 派出所内部卫生制度
- 国企员工行为规范管理制度
- 教师论文写作培训课件
- 河道治理课件
- 2025重症医学同步习题与全真模拟试题及答案
评论
0/150
提交评论