2012-12-06 44 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调用和自己的超时。同步的数据几乎可以即时获得。我们已经将这种技术用于多个客户和众多数据点。超时只是为了确保浏览器不会给出“服务器响应时间太长”的错误。试试看,你会看到它的作品。 –