摘要:
本人为实现P2P网络下的视频点播和直播而研究这一课题。但凡了解过Jxta技术的人都应该知道,在Jxta中,所有的资源都是以广告的形式表现,广告是一种XML格式的结构化文档,而这种文档却无法包含媒体数据。于是只得另想他途——采用虚拟管道通信实现之。思路不慎严谨,欢迎各位Matrixer参与讨论。
Sun微系统公司公开了旨在建立P2P(Peer to Peer)通用技术基础的
JXTA计划。JXTA技术是网络编程和计算的平台,用以解决现代分布计算尤其是点对点(P2P)计算中出现的问题。
JXTA 将建立核心的网络计算技术,提供支持在任何平台、任何地方以及任何时间实现P2P计算的一整套简单、小巧和灵活的机制。JXTA首先将归纳目前P2P的功能特别,而后建立核心的技术来表达目前的P2P计算的局限性。其重点是创建基本的机制,而具体的策略选择权则交给应用的开发者。JXTA将充分利用 XML、Java等开放技术,使得UNIX操作系统更强大和灵活,比如利用管道(Pipes)传输Shell命令实现复杂的计算任务。JXTA支持P2P 应用的基本功能来建立一个P2P系统,还将努力证实这些可以成为建立更高层功能的基础构造模块。
JXTA架构可以分为三个层面:JXTA核心层、JXTA 业务层和JXTA应用层。
本人为实现P2P网络下的视频点播和直播而研究这一课题。但凡了解过Jxta技术的人都应该知道,在Jxta中,所有的资源都是以广告的形式表现,广告是一种XML格式的结构化文档,而这种文档却无法包含媒体数据。为此,我曾试验过一种很傻的实现,那就是把媒体数据读出来的字节数组转化为字符串,然后将其包含在管道广告中,另一端通过搜索到该广告而从中获得这一字符串再还原为字节数组,结果失败。对这两个文件进行比较,有局部地方发生了变化。于是只得另想他途。
呵呵,Jxta真的可以成为网络Radio吗?
众所周知,现在的网络通讯通常使用TCP或是UDP协议,而TCP常常因为资源占用太大而在媒体数据传输时弃之不用,UDP成为了解决方案之一。在JXTA中,也有类似UDP协议的实现,通过构造JxtaMulticastSocket类来实现。该类与Socket类类似,不过构造方式有了很大的变化,后者通过IP和端口,而该类则通过管道广告,这便具有了JXTA技术的特点,因为JXTA是采用虚拟管道通信,而管道资源的表现形式是广告。以下是一段代码,用来发送媒体数据的:
class SendMessageThread extends Thread {
public void run() {
System.out.println("SendMessageThread is run.");
int sendCount = 0;
File file = null;
try {
file = new File("E://TDdownload//Movie//23409484.wmv");
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] buf = new byte[4096];
int i = 0;
try {
JxtaMulticastSocket tmpSocket = new JxtaMulticastSocket(pg,
pipeAdv);
System.out.println(pipeAdv);
while ((i = bis.read(buf)) != -1) {
sendCount++;
System.out.println(buf);
DatagramPacket dp = new DatagramPacket(buf, buf.length);
tmpSocket.send(dp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Send DataPackeg:" + sendCount);
System.out.println("send a message end !");
System.exit(0);
}
}
这是一个内部线程类,用来发送媒体数据。因为是测试,没有用到流媒体服务器,因此此处用文件流取代了。
以下是另一个内部线程类,用来收接媒体数据:
class ReciveMessageThread extends Thread {
public void run() {
int recvierCount = 0;
System.out.println("ReciveMessageThread is run.");
byte[] buf = new byte[4096];
try {
file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
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, buf.length);
System.out.println(dp.getData());
try {
jms.receive(dp);
} catch (SocketTimeoutException e) {
System.out.println("not data.");
break;
} finally {
bos.write(dp.getData());
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.flush();
bos.close();
bos = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
fos = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println("Recvier DataPackeg:" + recvierCount);
System.out.println("Recvier is over");
System.exit(0);
}
}
jms也是一个类的对象,通过跟发送方管道广告构造, (此处一定要注意,发送方和接收方的构造管道广告参数一定是一样的)免得大家走弯路,我可是在这上面浪费了两天时间的。
其余代码则省略了。无非是一些构建网络,查找加入组,搜索广告的操作。该代码通过了在局网内两台电脑上的运行测试。由于时间关系,没做进一步优化,也由于其他原因,我不便将全部代码上传,还望见谅!
此项目采用的是广播方式,其实,事后我也想过,既然服务器端和客户端均由软件开发人员完成,大可以事先构造一个管道广告,然后让服务器端和客户端共用这个管道广告来构造JxtaMulticastSocket的对象,毕竟在JXTA中,所有资源用广告来标识,而广告ID也是唯一的,类似于我们的IP地址。而JXTA本身就有缓存机制,广告被一个对等体搜索到后会缓存在本地一段时间,而除非人为操作或是到期,该广告不会根据该广告所表示的资源是否在线而消失。因此可以省去搜索管道广告的这一过程,而通过捕获异常或其他办法来解决通过JXTA构建的P2P网络的不稳定性。
相关链接
* setve关于JXTA的其它文章: 使用JXTA技术建立P2P网络
本文转自
http://www.matrix.org.cn/resource/article/2007-05-18/JXTA%E4%B8%8B%E7%9A%84%E5%AA%92%E4%BD%93%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93_ff5b37ef-04fc-11dc-b893-bfacd340f814.html
JXTA 将建立核心的网络计算技术,提供支持在任何平台、任何地方以及任何时间实现P2P计算的一整套简单、小巧和灵活的机制。JXTA首先将归纳目前P2P的功能特别,而后建立核心的技术来表达目前的P2P计算的局限性。其重点是创建基本的机制,而具体的策略选择权则交给应用的开发者。JXTA将充分利用 XML、Java等开放技术,使得UNIX操作系统更强大和灵活,比如利用管道(Pipes)传输Shell命令实现复杂的计算任务。JXTA支持P2P 应用的基本功能来建立一个P2P系统,还将努力证实这些可以成为建立更高层功能的基础构造模块。
JXTA架构可以分为三个层面:JXTA核心层、JXTA 业务层和JXTA应用层。
本人为实现P2P网络下的视频点播和直播而研究这一课题。但凡了解过Jxta技术的人都应该知道,在Jxta中,所有的资源都是以广告的形式表现,广告是一种XML格式的结构化文档,而这种文档却无法包含媒体数据。为此,我曾试验过一种很傻的实现,那就是把媒体数据读出来的字节数组转化为字符串,然后将其包含在管道广告中,另一端通过搜索到该广告而从中获得这一字符串再还原为字节数组,结果失败。对这两个文件进行比较,有局部地方发生了变化。于是只得另想他途。
呵呵,Jxta真的可以成为网络Radio吗?
众所周知,现在的网络通讯通常使用TCP或是UDP协议,而TCP常常因为资源占用太大而在媒体数据传输时弃之不用,UDP成为了解决方案之一。在JXTA中,也有类似UDP协议的实现,通过构造JxtaMulticastSocket类来实现。该类与Socket类类似,不过构造方式有了很大的变化,后者通过IP和端口,而该类则通过管道广告,这便具有了JXTA技术的特点,因为JXTA是采用虚拟管道通信,而管道资源的表现形式是广告。以下是一段代码,用来发送媒体数据的:
class SendMessageThread extends Thread {
public void run() {
System.out.println("SendMessageThread is run.");
int sendCount = 0;
File file = null;
try {
file = new File("E://TDdownload//Movie//23409484.wmv");
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] buf = new byte[4096];
int i = 0;
try {
JxtaMulticastSocket tmpSocket = new JxtaMulticastSocket(pg,
pipeAdv);
System.out.println(pipeAdv);
while ((i = bis.read(buf)) != -1) {
sendCount++;
System.out.println(buf);
DatagramPacket dp = new DatagramPacket(buf, buf.length);
tmpSocket.send(dp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Send DataPackeg:" + sendCount);
System.out.println("send a message end !");
System.exit(0);
}
}
这是一个内部线程类,用来发送媒体数据。因为是测试,没有用到流媒体服务器,因此此处用文件流取代了。
以下是另一个内部线程类,用来收接媒体数据:
class ReciveMessageThread extends Thread {
public void run() {
int recvierCount = 0;
System.out.println("ReciveMessageThread is run.");
byte[] buf = new byte[4096];
try {
file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
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, buf.length);
System.out.println(dp.getData());
try {
jms.receive(dp);
} catch (SocketTimeoutException e) {
System.out.println("not data.");
break;
} finally {
bos.write(dp.getData());
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.flush();
bos.close();
bos = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
fos = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println("Recvier DataPackeg:" + recvierCount);
System.out.println("Recvier is over");
System.exit(0);
}
}
jms也是一个类的对象,通过跟发送方管道广告构造, (此处一定要注意,发送方和接收方的构造管道广告参数一定是一样的)免得大家走弯路,我可是在这上面浪费了两天时间的。
其余代码则省略了。无非是一些构建网络,查找加入组,搜索广告的操作。该代码通过了在局网内两台电脑上的运行测试。由于时间关系,没做进一步优化,也由于其他原因,我不便将全部代码上传,还望见谅!
此项目采用的是广播方式,其实,事后我也想过,既然服务器端和客户端均由软件开发人员完成,大可以事先构造一个管道广告,然后让服务器端和客户端共用这个管道广告来构造JxtaMulticastSocket的对象,毕竟在JXTA中,所有资源用广告来标识,而广告ID也是唯一的,类似于我们的IP地址。而JXTA本身就有缓存机制,广告被一个对等体搜索到后会缓存在本地一段时间,而除非人为操作或是到期,该广告不会根据该广告所表示的资源是否在线而消失。因此可以省去搜索管道广告的这一过程,而通过捕获异常或其他办法来解决通过JXTA构建的P2P网络的不稳定性。
相关链接
* setve关于JXTA的其它文章: 使用JXTA技术建立P2P网络
本文转自
http://www.matrix.org.cn/resource/article/2007-05-18/JXTA%E4%B8%8B%E7%9A%84%E5%AA%92%E4%BD%93%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93_ff5b37ef-04fc-11dc-b893-bfacd340f814.html