1:6个协议组成。2:peer;peergroup;pipe;endpoint3:做对等通信和发现时,使用AD,是一个XML文件,该XML文件时大多数协议的基础。4:XML(ExtensibleMarkupLanguage)即可扩展标记语言,它与HTML一样,都是SGML(StandardGeneralizedMarkupLanguage,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。5:3个层次:JATA核心层;服务层;应用层。6:大多数广告编码是UTF-87:message:XML和二进制8:JXTA-JXSE2.5是JXTA的最新版本,相比以前的版本拥有一些新的特性和机制,以前版本的一些方法在这个版本中也已经过时。为了使用更加完善健全的JXTA平台,SUIS系统有理由采用JXSE2.5进行开发。由于此版本与以前版本的诸多不同,相关资料也不是很系统和健全,有必要学习一下JXSE2.5的开发方法与工作原理。本系列文章就此目的而作,算是我学习研究的心得,就能够用于SUIS开发的内容加以研究和阐述,以供各位SUIS开发成员参考。目前可供参考的资料有:《JXSEv2.5ProgrammersGuide》《JXTAProtocols》jxse-doc-2.5jxse-src-2.5、jxse-tutorials-src-2.5.zip(源代码)JXTA官方网站:这些资料在suis.sjtu.edu.cn上都有,可以通过http或者ftp下载。希望大家能提供其他资料,并且一起来参与这个系列文章的写作,令我们能更好掌握JXSE2.5的开发,让SUIS更出色。JXTJXTA程序的启动请参考jxsetutorials中的helloworld的源代码。JXTA程序在启动之前都需要进行配置,管理整个JXTA程序的是net.jxta.platform.NetworkManager类的一个实例:manager=newNetworkManager(NetworkManager.ConfigMode.ADHOC,HelloWorld,newFile(newFile(.cache),HelloWorld).toURI());manager.startNetwork();NetworkManager的构造函数的第一个参数是本Peer的类型,tutorial里写的是ADHOC,我们一般使用EDGE、RELAY、RENDEZVOUS或者RENDEZVOUS_RELAY。HelloWorld是节点名称,第三个参数定义了Home的位置,此处是程序目录下的.cache/HelloWorld/文件夹。Home用于保存和JXTA节点有关的所有信息,包括配置文件和广告、对等组信息等缓存文件。生成了NetworkManager之后可以通过startNetwork启动JXTA平台,将作一些相关初始化活动并加入NetPeerGroup,这一切都由JXTA自动完成。startNetwork将返回NetPeerGroup的一个实例,在以后我们会用到。现在做到的,仅仅是根据默认配置启动JXTA,这是远远不够的,我们必须按照自己的要求对节点进行配置。配置JXTA参考tutorial:WorkingWithLocalConfiguration。首先,对于NetworkManager的配置必须在调用startNetwork之前。不然将使用默认配置。对NetworkManager可以设置模式、PeerID、Home位置等,一个比较重要的设置是setConfigPersistent,设为true的话,在启动JXTA平台时会将当前配置写入Home目录的PlatformConfig文件中,以供下次读取。更多的设置是通过net.jxta.platform.NetworkConfigurator类来实现的,可以通过调用NetworkManager的getConfigurator()函数获得对应NetPeerGroup的NetworkConfigurator。在NetworkConfigurator中可以进行的各种设置在此不一一赘述,详见JXSEdoc。需要说明的是NetworkConfigurator可以通过读取PlatformConfig文件以载入预先完成的配置。NetworkConfigurator载入配置的代码在tutorial和doc中都有出现,应当加以掌握。连接RendezvousJXSE2.5提供了我们一些有趣的方法以连接到Rendezvous节点。基本上依靠的是预先配置好的RDVSeeds,这些RDVSeeds提供固定的IP,并且保证RDV总是能够响应。JXTA官方本身就为NetPeerGroup提供了一些RDVSeeds,我们可以通过NetworkManager配置我们的节点在启动JXTA之时就自动连接这些官方的RDV:TheNetworkManager.setUseDefaultSeeds(true);我在使用了这一配置之后,用wireshark查看网络流量时发现我的JXTA节点自动对192.18.37.37、192.18.37.38、192.18.37.39这些地址的9701端口发起了连接。可见节点先是保存了一系列的RDVSeeds,并在启动后从中挑选一些进行连接。我们可以使用NetworkConfigurator的addSeedRendezvous(URIseedURI)函数加入我们自己的RDVSeed,例如我用下面的语句给节点添加一个RDVseed:config.addSeedRendezvous(newURI(tcp://59.78.20.123:9701));其中59.78.20.123是我电脑的IP,9701是JXTA的默认端口号。当我在我电脑上运行一个RDV实例之后,添加了这个seed的节点就能够连接上我的RDV了。如何动态添加RDVSeed呢?SUIS系统的设计中,将当前活动的RDV形成列表保存在服务器端,由节点随时读取并动态连接上面的RDV。在JXSE2.5中也有类似的机制,令节点可以从RDVSeedingURI获取RDVSeeds的信息。当配置节点使用JXTA默认的RDVSeeds时,将从页面获取那些官方的RDVSeeds。大家可以访问一下这个页面,观察一下形式。其实由JXTA客户端去访问这个页面和从浏览器访问得到的结果是不同的,JXTA程序直接去访问时还会返回PeerID等信息,但是似乎影响不大。我也做了一个类似的页面,,并且在程序里进行了配置:config.addRdvSeedingURI();结果实验成功,节点顺利连接上我开设的RDV。研究好JXTA对开发SUIS至关重要,我觉得我们还有一定的路要走,在此先开个头,希望大家都加入进来。我也会继续学习,并及时写成心得发布。9:JXTA的一个例子[加了注释]这是一个简单的应用JXTA的客户/服务器结构的例子,服务器端创建监听线程,客户端主动连接一次。所有代码非常简洁的说明了JXTA的C/S应用的设计框架,原例子是在,我在本机和局域网内已调试通过,并加了注释,有兴趣的朋友看看吧。需要引用的jar包有三个:jxta.jar,log4j.jar,bcprov-jdk14.jar服务器端packagecom.solo.server;importjava.io.*;importnet.jxta.discovery.*;importnet.jxta.document.*;importnet.jxta.endpoint.*;importnet.jxta.exception.*;importnet.jxta.id.*;importnet.jxta.peergroup.*;importnet.jxta.pipe.*;importnet.jxta.platform.*;importnet.jxta.protocol.*;publicclassSoloServer{staticPeerGroupgroup=null;staticPeerGroupAdvertisementgroupAdvertisement=null;privateDiscoveryServicediscovery;privatePipeServicepipes;privateInputPipemyPipe;//输入管道,从客户端来的privateMessagemsg;//收到的消息privateIDgid;publicstaticvoidmain(String[]args){SoloServermyServer=newSoloServer();System.out.println(Startingservicepeer...);System.out.println(System.getProperty(user.dir));myServer.startJxta();System.out.println(GoodBye....);System.exit(0);}privatevoidstartJxta(){try{//开始,要使用默认的JXTA组group=PeerGroupFactory.newNetPeerGroup();}catch(PeerGroupExceptionex){System.out.println(fatalerror:groupcreationfailure);ex.printStackTrace();System.exit(1);}//得到默认组的通告groupAdvertisement=group.getPeerGroupAdvertisement();//获取该通告的发现服务System.out.println(GettingDiscoveryService...);discovery=group.getDiscoveryService();//获取该通告的管道服务System.out.println(GettingPipeService...);pipes=group.getPipeService();startServer();}privatevoidstartServer(){System.out.println(StarttheServerdaemon...);//读该组的IDgid=group.getPeerGroupID();try{//创建一个模块化的简单的通告,此通告仅仅用来表示该服务的存在。//如果端点要访问该服务,还得创建一个指定的通告,来关联服务。ModuleClassAdvertisementmcadv=(ModuleClassAdvertisement)AdvertisementFactory.newAdvertisement(ModuleClassAdvertisement.getAdvertisementType());mcadv.setName(JXTAMOD:JXTA-SOLO-XDS-CN);mcadv.setDescription(SOLOSERVERFORSOLO-CNWITHJXTAFRAMEWORK.);ModuleClassIDmcID=IDFactory.newModuleClassID();mcadv.setModuleClassID(mcID);disc