Sun微系统公司公开了旨在建立PP(Peer to Peer)通用技术基础的JXTA计划JXTA技术是网络编程和计算的平台用以解决现代分布计算尤其是点对点(PP)计算中出现的问题
JXTA 将建立核心的网络计算技术提供支持在任何平台任何地方以及任何时间实现PP计算的一整套简单小巧和灵活的机制JXTA首先将归纳目前PP的功能特别而后建立核心的技术来表达目前的PP计算的局限性其重点是创建基本的机制而具体的策略选择权则交给应用的开发者JXTA将充分利用 XMLJava等开放技术使得UNIX操作系统更强大和灵活比如利用管道(Pipes)传输Shell命令实现复杂的计算任务JXTA支持PP 应用的基本功能来建立一个PP系统还将努力证实这些可以成为建立更高层功能的基础构造模块
JXTA架构可以分为三个层面JXTA核心层JXTA 业务层和JXTA应用层
本人为实现PP网络下的视频点播和直播而研究这一课题但凡了解过Jxta技术的人都应该知道在Jxta中所有的资源都是以广告的形式表现广告是一种XML格式的结构化文档而这种文档却无法包含媒体数据为此我曾试验过一种很傻的实现那就是把媒体数据读出来的字节数组转化为字符串然后将其包含在管道广告中另一端通过搜索到该广告而从中获得这一字符串再还原为字节数组结果失败对这两个文件进行比较有局部地方发生了变化于是只得另想他途
呵呵Jxta真的可以成为网络Radio吗?
众所周知现在的网络通讯通常使用TCP或是UDP协议而TCP常常因为资源占用太大而在媒体数据传输时弃之不用UDP成为了解决方案之一在JXTA 中也有类似UDP协议的实现通过构造JxtaMulticastSocket类来实现该类与Socket类类似不过构造方式有了很大的变化后者通过IP和端口而该类则通过管道广告这便具有了JXTA技术的特点因为JXTA是采用虚拟管道通信而管道资源的表现形式是广告以下是一段代码用来发送媒体数据的
class SendMessageThread extends Thread {
public void run() {
Systemoutprintln(SendMessageThread is run);
int sendCount = ;
File file = null;
try {
file = new File(E:\\TDdownload\\Movie\\wmv);
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
} catch (FileNotFoundException e) {
// TODO Autogenerated catch block
eprintStackTrace();
}
byte[] buf = new byte[];
int i = ;
try {
JxtaMulticastSocket tmpSocket = new JxtaMulticastSocket(pg
pipeAdv);
Systemoutprintln(pipeAdv);
while ((i = bisread(buf)) != ) {
sendCount++;
Systemoutprintln(buf);
DatagramPacket dp = new DatagramPacket(buf buflength);
tmpSocketsend(dp);
}
} catch (IOException e) {
// TODO Autogenerated catch block
eprintStackTrace();
}
Systemoutprintln(Send DataPackeg: + sendCount);
Systemoutprintln(send a message end !);
Systemexit();
}
}
这是一个内部线程类用来发送媒体数据因为是测试没有用到流媒体服务器因此此处用文件流取代了
以下是另一个内部线程类用来收接媒体数据
class ReciveMessageThread extends Thread {
public void run() {
int recvierCount = ;
Systemoutprintln(ReciveMessageThread is run);
byte[] buf = new byte[];
try {
file = new File(filePath);
if (!fileexists()) {
filecreateNewFile();
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
} else {
fos = new FileOutputStream(file true);
bos = new BufferedOutputStream(fos);
}
while (jms != null) {
recvierCount++;
DatagramPacket dp = new DatagramPacket(buf buflength);
Systemoutprintln(dpgetData());
try {
jmsreceive(dp);
} catch (SocketTimeoutException e) {
Systemoutprintln(not data);
break;
} finally {
boswrite(dpgetData());
}
}
} catch (IOException e) {
// TODO Autogenerated catch block
eprintStackTrace();
} finally {
if (bos != null) {
try {
bosflush();
bosclose();
bos = null;
} catch (IOException e) {
// TODO Autogenerated catch block
eprintStackTrace();
}
}
if (fos != null) {
try {
fosclose();
fos = null;
} catch (IOException e) {
// TODO Autogenerated catch block
eprintStackTrace();
}
}
}
Systemoutprintln(Recvier DataPackeg: + recvierCount);
Systemoutprintln(Recvier is over);
Systemexit();
}
}
jms也是一个类的对象通过跟发送方管道广告构造(此处一定要注意发送方和接收方的构造管道广告参数一定是一样的)免得大家走弯路我可是在这上面浪费了两天时间的
其余代码则省略了无非是一些构建网络查找加入组搜索广告的操作该代码通过了在局网内两台电脑上的运行测试由于时间关系没做进一步优化也由于其他原因我不便将全部代码上传还望见谅!
此项目采用的是广播方式其实事后我也想过既然服务器端和客户端均由软件开发人员完成大可以事先构造一个管道广告然后让服务器端和客户端共用这个管道广告来构造JxtaMulticastSocket的对象毕竟在JXTA中所有资源用广告来标识而广告ID也是唯一的类似于我们的IP地址而 JXTA本身就有缓存机制广告被一个对等体搜索到后会缓存在本地一段时间而除非人为操作或是到期该广告不会根据该广告所表示的资源是否在线而消失因此可以省去搜索管道广告的这一过程而通过捕获异常或其他办法来解决通过JXTA构建的PP网络的不稳定性