这是一个简单的应用
JXTA
的客户/服务器结构的
例子
,服务器端创建监听线程,客户端主动连接一次。所有代码非常简洁的说明了
JXTA
的C/S应用的设计框架,原
例子
是在
http://www.
jxta
.org/Tutorials.html
,我在本机和局域网内已调试通过,并加了注释,有兴趣的朋友看看吧。
需要引用的jar包有三个:
jxta
.jar,log4j.jar,bcprov-jdk14.jar
服务器端
客户端
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 {
static PeerGroupnetPeerGroup = null ;
static PeerGroupAdvertisementgroupAdvertisement = null ;
private DiscoveryServicediscovery;
private PipeServicepipes;
private OutputPipemyPipe; // 输出管道,到服务的
private Messagemsg;
public SoloClient() {
}
public static void main(String[]args) {
SoloClientmyClient = new SoloClient();
System.out.println( " StartingClientpeer.... " );
myClient.startJxta();
System.out.println( " GoodBye.... " );
System.exit( 0 );
}
/**
*
*startJxta
*/
private void startJxta() {
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();
}
private void startClient() {
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 = new StringWriter();
doc.sendToWriter(out);
System.out.println(out.toString());
out.close();
// 根据获取的通告,获取管道
PipeAdvertisementpipeadv = mdsadv.getPipeAdvertisement();
// 用上面的通道,通知服务创建输出通道了,试着创建3次。
for ( int i = 0 ;i < 3 ;i ++ ) {
myPipe = pipes.createOutputPipe(pipeadv, 10000 );
}
// 要说的话
Stringdata = " 我靠,成功啦!!! " ;
// 组织成消息
msg = new Message();
StringMessageElementsme = new StringMessageElement( " 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>
第一次启动服务器和客户端时需要输入节点名和密码,随便输入就可以了。
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 {
static PeerGroupgroup = null ;
static PeerGroupAdvertisementgroupAdvertisement = null ;
private DiscoveryServicediscovery;
private PipeServicepipes;
private InputPipemyPipe; // 输入管道,从客户端来的
private Messagemsg;
// 收到的消息
private IDgid;
public static void main(String[]args) {
SoloServermyServer = new SoloServer();
System.out.println( " Startingservicepeer... " );
System.out.println(System.getProperty( " user.dir " ));
myServer.startJxta();
System.out.println( " GoodBye.... " );
System.exit( 0 );
}
private void startJxta() {
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();
}
private void startServer() {
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(<
发表评论
评论