如何从服务器接收更新而不请求每n秒

时间:2014-10-09 15:26:01

标签: php mysql node.js angularjs cordova

我正在构建一个移动应用程序,只要服务器有新数据,就可以从服务器接收数据。我正在为我的移动应用程序使用cordova和离子框架,为移动应用程序获取数据的API和服务器使用PHP / MySQL / Apache。

有什么方法可以从我的服务器检索数据(JSON格式),而不是在我的移动应用程序中使用http.get每隔n秒不断地请求数据?因为我只需要在有新数据时获取,而不是一直有新数据,但有时,在峰值时它每秒都有新数据。 Apache / PHP可以处理这个问题,还是我需要切换到例如nodejs之类的东西?提前谢谢。

顺便说一句,我希望我的移动应用程序能在一秒钟内收到数据。

我的问题与此Receive update from server with mobile frameworkhttps://softwareengineering.stackexchange.com/questions/225589/how-to-refresh-keep-up-to-date-content-in-the-browser-without-overloading-the-se非常相似,但我现在仍然挂着。

1 个答案:

答案 0 :(得分:1)

Node.js和Socket.io使得这样的东西几乎是微不足道的,但是你可以用几乎任何web后端来做到这一点。这样做有几个选择,但我尽可能地倾向于websockets。我从来没有使用它,但Ratchet似乎做了你想要的PHP。看看他们的Hello World tutorial,看看如何设置它。

更新

由于您正在使用Cordova,因此websockets是有意义的。以下是使用socket.io的Node.js中的示例实现。

var app = require('http').createServer(handler);
var io = require('socket.io')(app);

app.listen(80);

function handler (req, res) {
  // We aren't serving any http requests outside of socket.io. 
  // Return a 404 error for all other requests.
  res.status(404).send('Not found');
}

io.on('connection', function (socket) {
  //  This is either a new client connection, or a client reconnecting. 
  //  You can use cookies to establish identity and handle reconnects 
  //  differently if necessary.

  socket.on('new-content', function(content) {
    //  persist the file in the database if necessary and resend it to all 
    //  connected clients
    socket.broadcast.emit('new-content', content);
  });
});

这里我们只是创建一个简单的中继服务器。您可以发送一个'文件'在这种情况下,它只是一串内容,它将被发送给所有其他连接的用户。在这种情况下,您不必继续查询数据库以查找新内容,您可以从客户端传入的内容中触发它。如果您希望离线用户在上线时能够接收该内容,您需要某种持久性和机制来跟踪和处理该内容。

客户端脚本也非常简单。

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://myserver.com');
  socket.on('new-file function (content) {
    // A new file was sent from the server, do something with the content here.
  });

  function sendFile(content) {
    socket.emit('new-file', content);  
  }
</script>