本文是接前面两篇,结束本篇就完成密码对等组创建,发现及加入的过程。
发现一个对等组在以前关于JXTA中的文章中都有说到,没有什么大的差别,在这里主要是注意验证器如何验证用户和密码的过程,不过也相对比较简单。代码的注释中都有详细的说明。直接秀出代码:
1、搜索对等组方法
//搜索到该“群”
private PeerGroup discoveryPeerGroup(PeerGroup netpg,
PeerGroupID satellaPID) {
//要加入”群“,首先,得搜索到”群“
//在很多情况下,我们一般使用发现监听及时发现
//在这里我不这样,因为已经确定对等组广告是在本地缓存中,相对比较简单
PeerGroup satellaPeerGroup = null;
DiscoveryService netpgService = null;
if(null!=netpg){
netpgService = netpg.getDiscoveryService();
}else{
System.out.println("父对等组为空,不能加入目标对等组");
System.exit(-1);
}
boolean isGroupFound = false;
Enumeration localPGAdv = null;
PeerGroupAdvertisement spgAdv = null;
while(!isGroupFound){
try {
localPGAdv = netpgService.getLocalAdvertisements(DiscoveryService.GROUP, "GID", satellaPID.toString());
} catch (IOException e) {
System.out.println("本地没有发现该对等组广告");
e.printStackTrace();
}
if(null!=localPGAdv){
while(localPGAdv.hasMoreElements()){
PeerGroupAdvertisement pgAdv = null;
pgAdv = (PeerGroupAdvertisement)localPGAdv.nextElement();
if(pgAdv.getPeerGroupID().equals(satellaPID)){
spgAdv = pgAdv;
isGroupFound = true;
break;
}
}
}
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
satellaPeerGroup = netpg.newGroup(spgAdv);
} catch (PeerGroupException e) {
System.out.println("不能用对等组广告创建目标对等组");
e.printStackTrace();
return null;
}
return satellaPeerGroup;
}
2、验证器对身份认证
/**
* 要执行该方法而且是符合要求完认证后才能加入到对等组。为了完成验证,验证方法需求从验证器(auth)中提取。
* 这些方法的名称开始是"setAuth"。其中setAuth1Identity方面支持验证login,而setAuth2_Password支持验证passwd
* @param auth
* @param login
* @param passwd
*/
private void completeAuth(Authenticator auth, String login, String passwd) {
Method[] methods = auth.getClass().getMethods();
Vector authMethods = new Vector();
//下面for循环只是对auth中的方法过滤和排序
for(int eachMethod = 0;eachMethod<methods.length;eachMethod++){
if(methods[eachMethod].getName().startsWith("setAuth")){
if(Modifier.isPublic(methods[eachMethod].getModifiers())){
for(int doInsert = 0;doInsert<=authMethods.size();doInsert++){
int insertHere = 1;
if(doInsert == authMethods.size()){
insertHere = doInsert;
}else{
if(methods[eachMethod].getName().compareTo(((Method)authMethods.elementAt(doInsert)).getName())<=0){
insertHere = doInsert;
}
}
if(-1!=insertHere){
authMethods.insertElementAt(methods[eachMethod], insertHere);
break;
}//end if (-1 != insertHere)
}//end for(int doInsert =0
}//end if (modifier.isPublic
}//end if (methods[eachMethod]
}//end for (int eachMethod)
Object[] AuthId = {login};
Object[] AuthPasswd = {passwd};
//重点是下面,调用验证器的验证方法对用户和密码进行确认
for(int eachAuthMethod = 0;eachAuthMethod<authMethods.size();eachAuthMethod++){
Method doingMethod = (Method)authMethods.elementAt(eachAuthMethod);
if(doingMethod.getName().equals("setAuth1Identity")){
//
try {
doingMethod.invoke(auth, AuthId);
} catch (Exception e) {
e.printStackTrace();
}
}else
if(doingMethod.getName().equals("setAuth2_Password")){
try {
doingMethod.invoke(auth, AuthPasswd);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3、确认身份,通过认证则加入,不通过则不能加入
//加入“群”
private void joinPeerGroup(PeerGroup spg, String login, String passwd) {
StructuredDocument creds = null;
AuthenticationCredential authCred = new AuthenticationCredential(spg,null,creds);
MembershipService membershipService = spg.getMembershipService();
Authenticator auth = null;
try {
auth = membershipService.apply(authCred);
completeAuth(auth,login,passwd);
if(!auth.isReadyForJoin()){
System.out.println("身份认证失败");
System.out.println("没有完成认证,不能加入对等组");
}
membershipService.join(auth);
} catch (Exception e) {
System.out.println("认证失败");
System.out.println("登录信息不正确,不能加入对等组");
e.printStackTrace();
System.exit(-1);
}
}
加上这篇,“JXTA中通过身份认证来加入“群””的全部过程完成。代码也已经全部共享。