2012-12-06 43 views
0

我正在開發一個項目,在這個項目中,當服務器上創建一個txt文件時,我需要宣佈一個聲明,我需要通過音頻通知來通知所有用戶,音頻應該在當前頁面上的任何客戶端瀏覽器上立即播放。公告的播放需要同步到最大精度。什麼是在不同的頁面上同時播放音頻的播放列表的最佳方式

該通知由多個音頻文件(播放列表)組成。

在所有活動客戶端播放通告後,txt文件將被刪除。並且服務器將等待/查找另一個txt文件。

例如: 客戶端1 - 服務器時間:19時22分01秒,收到通知和播放音頻 客戶端2 - 服務器時間:19時22分01秒,收到通知和播放音頻

任何建議?關於如何在所有客戶中立即完成公告,有何技巧? MySQL數據庫或 的Flash,小程序,HTML5音頻和jQuery等

謝謝..

+0

您可以使用長輪詢。它基本上是一個簡單的輪詢器,直到有數據纔會返回。讓長輪詢器(通常是PHP)中的代碼輪詢數據庫以查找事件。這種情況下,您可以在數據庫上進行毫秒精確輪詢,而無需使用現成的技術創建大量數據流量。 –

+0

目前我正在使用類似的方法,但仍有差不多1.5秒。我想減少。 –

+0

找出1.5秒來自哪裏。我們創建了長達1分鐘的超時輪詢器,並在100毫秒內響應100毫秒輪詢。 (另外:你真的需要亞秒精度嗎?也許你使用的是錯誤的工具,然後......) –

回答

0

我寫了簡單的PHP長輪詢技術,阿賈克斯EN MySQL的:

的PHP代碼如下:

timeout = 600; 
while (timeout > 0) { 
    $res = db_query("QUERY"); 
    $return_value = create_value_from_result($res); 

    // see if the result changed 
    $db_hash = md5($return_value); 

    if ($_SESSION['hash'] == $db_hash) { 
     // the result didn't change -- sleep and poll again 
     // usleep take microseconds, 100000 is 100 millisecond 
     // this is the default database polling interval 
     usleep(100000); 
     $timeout--; 
    } else { 
     // the result changed -- reply the result and set the session hash 
     $timeout = 0; 
     $_SESSION['hash'] = $db_hash; 
    } 
} 
return json_encode($return_value); 

和JavaScript是簡單的Ajax(Dojo是這種情況):

function longpoll() { 
    dojo.xhrPost({ 
     url: 'longpolling.php', 
     load: function (data, ioArgs) { 
      data = dojo.fromJson(data); 

      do_magic(data); 

      // use settimeout to avoid stack overflows 
      // we could also use a while(1) loop, 
      // but it might give browser errors such as 'script is 
      // running too long' (not confirmed) 
      setTimeout(longpoll, 0); 
     } 
    }); 
} 

您需要60秒超時以確保瀏覽器在Ajax調用中不超時。

這樣,只要QUERY的結果發生變化(插入記錄,更新記錄中的更新),PHP調用就會返回並且Ajax會得到結果。

+0

只有一個問題.. 60秒的超時會產生問題。如果兩個客戶正在運行?兩者都將顯示更新數據的精度。我希望他們展示它同步。 –

+0

如果兩個客戶端正在運行,他們將分別擁有自己的PHP調用和自己的超時。同步的數據幾乎可以即時獲得。我們已經將這種技術用於多個客戶和衆多數據點。超時只是爲了確保瀏覽器不會給出「服務器響應時間太長」的錯誤。試試看,你會看到它的作品。 –