PeerGroup的创建和加入

Peer Group的创建和加入
        JXTA中节点Peer可以形成自组织的组,即Peer Group (or Self-Organized Virtual Network Domain)。一个Peer Group代表了一组有共同的兴趣或者使用相同的策略的动态节点集。Peer Group由Peer Group ID唯一标识。Peer Group可以在应用程序中动态的创建。通常创建一个Peer Group主要出于以下原因[1]:
·创建一个受保护的域,用来安全地交换资源和内容
·创建一个域环境(scoping environment)
·创建一个可监控环境(包括流量监控,审计等)
        Suis架构中的订阅组主要是用来创建一个域环境,从而使组内的Advertisement仅在本组内可见。JXTA提供了创建和管理Peer Group的方法,至于什么时候,为什么创建Peer Group则由上层应用程序决定。下面将说明如何在JXTA中创建一个Peer Group,以及如何加入一个Peer Group。

创建Peer Group Advertisement
        要创建一个PeerGroup首先需要创建该PeerGroup的通告。要创建一个Peer Group Advertisement又首先需要获得一个标准的PeerGroup Implementation Advertisement,即GroupImplAdv,可以通过下面的方法获得。
ModuleImplAdvertisement customGroupImplAdv =
npg.getAllPurposePeerGroupImplAdvertisement();
        其中npg表示JXTA平台的NetPeerGroup。通过getAllPurposePeerGroupImplAdvertisement()方法得到的实现通告所指的实现可以用于创建任何仅依赖于标准PeerGroupService的PeerGroup。(当需要使用自定义服务时也可先用该方法得到通用的实现通告,然后通过setModuleSpecID()等方法对通用通告做一些修改得到所需的自定义实现的通告)
        获得了GroupImplAdv后就可以使用AdvertisementFactory创建GroupAdv了。
PeerGroupAdvertisement customGroupAdv = (PeerGroupAdvertisement)
AdvertisementFactory.newAdvertisement(PeerGroupAdvertisement.getAdvertisementType());
        然后需要通过customGroupAdv.setPeerGroupID(CUSTOM_PEERGROUP_ID)对PeerGroupID进行设置,通过 customGroupAdv.setModuleSpecID(customGroupImplAdv.getModuleSpecID());设置 ModuleSpecID,通过customGroupAdv.setName("Custom Peer Group")设置PeerGroup的名称等以获得符合要求的GroupAdv。PeerGroupAdvertisement还有很多方法,这里不再赘述,详见JXSE doc。PeerGroupAdvertisement创建之后还可以根据需要在npg中publish或者remotePublish。
需要注意的是对于AdvertisementFactory所创建的PeerGroupAdvertisement,必须使用setPeerGroupID对 ID进行设置,用setModuleSpecID对实现模块进行关联,否则将无法通过该通告来创建一个PeerGroup。 customGroupAdv.setModuleSpecID(customGroupImplAdv.getModuleSpecID());
而不设置其他诸如PeerGroup Name,Peer Group Description等属性依然可以通过该通告创建PeerGroup。

创建Peer Group
        这里仅讨论创建标准Peer Group(Standard Peer Group)的情况,对于具有自定义Group Service的Peer Group参见《JXSE Tutorials 2.5》中的custom group service。另外,在《JXTA Programmer Guider》的Chapter 17: Password Protected Peer Group中给出了创建带有认证的Membership Service的Peer Group的例子。
        创建一个Peer Group,首先需要取得该Peer Group的ADV。如是已有的组,则可以通过其父组的Discovery Service来获取要创建的组的Peer Group ADV。若是一个全新的组,则应首先创建该组的Peer Group ADV。上面已经介绍了创建一个标准Peer Group ADV的方法。现假设已有待创建的组的Peer Group ADV,要创建一个NetPeerGroup的子组。可以通过下面语句实现。
PeerGroup cpg = npg.newGroup(customGroupAdv);
cpg.startApp(new String[0]);
        这里,通过PeerGroup接口的newGroup(Advertisement pgAdv)方法实例化了customGroupAdv所表示的组。然后用startApp()完成组的所有初始化。startApp是一个继承自 Module接口的方法(PeerGroup继承了Service,Service继承了Module),该方法用于完成一个模块剩余的初始化工作,当 startApp()调用结束时,该模块就应该处于正常工作状态。对于用户自定义的组,通过startApp()可以完成自定义模块的启动。对于标准组 (Standard Peer Group),由于只有标准服务和模块,而这些诸如Endpoint Service,Rendezvous Service,Resolver Service, NoneMembership Service等标准Module属于JXTA的Privileged Module,会自动完成加载和初始化,所以对于标准组调用startApp()不是必须的。至此就完成了组的创建(实例化),现在可以通过 cpg.getDiscoveryService()等来获得cpg的各种标准对等组服务了。

加入Peer Group
        这里所讨论的加入PeerGroup仅对实现了Membership Service的对等组有意义。对于标准对等组,由于其使用了NoneMembershipService,所以对组内成员没有身份认证功能,其“加入” 也就没有意义,通过创建PeerGroup的实例实际上就完成了加入对等组。
对于实现了Membership Service的对等组(NoneMembershipService除外),加入对等组实际上就是获得组内的身份标识,使服务或者应用程序能够根据这种标识来判断Peer用户所具有的权限或者能力。通常通过以下两步骤来加入对等组。
·申请:将AuthenticationCredential提供给Membership Service,获得Authenticator。
Peer 给Membership Service提供一个最初的信任书AuthenticationCredential,Membership Service根据这个信任书来确定用哪种方式认证Peer的身份。如果服务允许Peer所请求的机制,就返回一个合适的认证者对象 Authenticator。
·加入:当Peer得到Authenticator后,它就会基于自己所有的信息(如口令等)调整Authenticator,然后加入对等组[2]。代码示例[3]:
AuthenticationCredential authCred = new AuthenticationCredential(cpg,null,null);
MembershipService membership = cpg.getMembershipService();
Authenticator auth = membership.apply(authCred);
completeAuth(auth,login,password);
if (auth.isReadyForJoin()){
membership.join(auth);
}
        其中completeAuth为用户定义的函数,用来完成authenticatiom。

转自:http://technica.blogbus.com/logs/15908922.html

你可能感兴趣的:(工作)