JXTA的一个例子[加了注释]

这是一个简单的应用JXTA的客户/服务器结构的例子,服务器端创建监听线程,客户端主动连接一次。所有代码非常简洁的说明了JXTA的C/S应用的设计框架,原例子是在http://www.jxta.org/Tutorials.html,我在本机和局域网内已调试通过,并加了注释,有兴趣的朋友看看吧。
需要引用的jar包有三个:jxta.jar,log4j.jar,bcprov-jdk14.jar
服务器端

客户端

package tutorial.socket;

import java.io. * ;
import java.util. * ;
import net.jxta.discovery. * ;
import net.jxta.document. * ;
import net.jxta.endpoint. * ;
import net.jxta.exception. * ;
import net.jxta.peergroup. * ;
import net.jxta.pipe. * ;
import net.jxta.protocol. * ;

public class SoloClient ... {
staticPeerGroupnetPeerGroup=null;

staticPeerGroupAdvertisementgroupAdvertisement=null;

privateDiscoveryServicediscovery;

privatePipeServicepipes;

privateOutputPipemyPipe;//输出管道,到服务的

privateMessagemsg;

publicSoloClient()...{
}


publicstaticvoidmain(String[]args)...{
SoloClientmyClient
=newSoloClient();
System.out.println(
"StartingClientpeer....");
myClient.startJxta();
System.out.println(
"GoodBye....");
System.exit(
0);
}


/***//**
*
*startJxta
*/

privatevoidstartJxta()...{
try...{
//创建默认的JXTA组。
netPeerGroup=PeerGroupFactory.newNetPeerGroup();
}
catch(PeerGroupExceptione)...{
System.out.println(
"fatalerror:groupcreationfailure");
e.printStackTrace();
System.exit(
1);
}

//获取该组通告
groupAdvertisement=netPeerGroup.getPeerGroupAdvertisement();

//获取该组发现服务
System.out.println("GettingDiscoveryService");
discovery
=netPeerGroup.getDiscoveryService();

//获取该组管道服务
System.out.println("GettingPipeService");
pipes
=netPeerGroup.getPipeService();
startClient();
}


privatevoidstartClient()...{
System.out.println(
"StarttheClient");

//找到服务
System.out
.println(
"searchingfortheJXTA-SOLO-XDS-CNServiceadvertisement");
Enumerationen
=null;
while(true)...{
try...{
//在本地的缓存中查找服务(JXTA-SOLO-XDS-CN)
en=discovery.getLocalAdvertisements(DiscoveryService.ADV,
"Name","JXTASPEC:JXTA-SOLO-XDS-CN");

//找到就好
if((en!=null)&&en.hasMoreElements())...{
break;
}

//本地没有,只好根据服务名称远程搜索
discovery.getRemoteAdvertisements(null,DiscoveryService.ADV,
"Name","JXTASPEC:JXTA-SOLO-XDS-CN",1,null);

//发现过程是异步的,我们不知道需要多长时间
try...{
Thread.sleep(
2000);
}
catch(Exceptione)...{
}

}
catch(IOExceptione)...{

//啥也没找到,继续
}

//显示点吧
System.out.print(".");
}

System.out.println(
"wefoundtheserviceadvertisement");

//找到以后,得到特殊服务的通告
ModuleSpecAdvertisementmdsadv=(ModuleSpecAdvertisement)en
.nextElement();
try...{
//显示一下通告而已
StructuredTextDocumentdoc=(StructuredTextDocument)mdsadv
.getDocument(MimeMediaType.TEXT_DEFAULTENCODING);
StringWriterout
=newStringWriter();
doc.sendToWriter(out);
System.out.println(out.toString());
out.close();

//根据获取的通告,获取管道
PipeAdvertisementpipeadv=mdsadv.getPipeAdvertisement();

//用上面的通道,通知服务创建输出通道了,试着创建3次。
for(inti=0;i<3;i++)...{
myPipe
=pipes.createOutputPipe(pipeadv,10000);
}

//要说的话
Stringdata="我靠,成功啦!!!";

//组织成消息
msg=newMessage();
StringMessageElementsme
=newStringMessageElement("DataTag",
data,
null);
msg.addMessageElement(
null,sme);

//通过管道发送吧
myPipe.send(msg);
System.out.println(
"message""+data+""senttotheServer");
}
catch(Exceptionex)...{
ex.printStackTrace();
System.out.println(
"Client:Errorsendingmessagetotheservice");
}

}

}

==========================================
在服务器端的根目录下还需要一个叫作pipeserver.adv的管道通告文件,这个文件的作用是使得每次服务启动时创建的都是同一个管道服务。

<?xml version="1.0"?>

<!DOCTYPE jxta:PipeAdvertisement>

<jxta:PipeAdvertisement xmlns:jxta="http://jxta.org">
<Id>
urn:jxta:uuid-9CCCDF5AD8154D3D87A391210404E59BE4B888209A2241A4A162A10916074A9504
</Id>
<Type>JxtaUnicast</Type>
<Name>JXTA-SOLO-XDS-CN</Name>
</jxta:PipeAdvertisement>

第一次启动服务器和客户端时需要输入节点名和密码,随便输入就可以了。

package tutorial.socket;

import java.io. * ;
import net.jxta.discovery. * ;
import net.jxta.document. * ;
import net.jxta.endpoint. * ;
import net.jxta.exception. * ;
import net.jxta.id. * ;
import net.jxta.peergroup. * ;
import net.jxta.pipe. * ;
import net.jxta.platform. * ;
import net.jxta.protocol. * ;

public class SoloServer ... {
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...");

//读该组的ID
gid=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);
discovery.publish(mcadv);
discovery.remotePublish(mcadv);

//创建一个指定的通告,使得端点可以与服务相连。该通告包含端点连接服务所需要的所有信息,

//例如它包含一个端点用来与服务关联的输入管道数据
ModuleSpecAdvertisementmdadv=(ModuleSpecAdvertisement)AdvertisementFactory
.newAdvertisement(ModuleSpecAdvertisement
.getAdvertisementType());

//填充相关的信息
mdadv.setName("JXTASPEC:JXTA-SOLO-XDS-CN");
mdadv.setVersion(
"VERISON1.0");
mdadv.setCreator(
"solo.com");
mdadv.setModuleSpecID(IDFactory.newModuleSpecID(mcID));
mdadv.setSpecURI(<
分享到:
评论

你可能感兴趣的:(应用服务器,.net,log4j,框架,socket)