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

系统 1544 0

这是一个简单的应用 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 ... {
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>

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

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 ... {
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(<
分享到:
评论

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论