JXTA的一个例子[加了注释]
系统
1671 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>
第一次启动服务器和客户端时需要输入节点名和密码,随便输入就可以了。
JXTA的一个例子[加了注释]
更多文章、技术交流、商务合作、联系博主
微信扫码或搜索:z360901061
微信扫一扫加我为好友
QQ号联系: 360901061
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
【本文对您有帮助就好】元
评论