熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JXTA下的媒體數據傳輸

2013-11-23 19:07:53  來源: Java核心技術 

  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網絡的不穩定性


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26325.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.