2

我正在尝试找到向我的用户发送在我的服务器上运行的进程的实时状态更新的最佳方式——该进程分为五个部分。现在我只是每隔几秒就使用一个 Ajax 调用将状态“拉”到一个连接到 MySQL 并读取状态的 PHP 文件,但是正如您可以想象的那样,这对我的数据库来说非常困难并且不起作用所以适合没有强大互联网连接的用户。

所以我正在寻找一种将数据“推送”到我的客户的解决方案。我现在在我的服务器上运行 APE 推送引擎,但我猜 Socket.IO 更适合这个?如果他们使用 3G 并且错过了状态更新怎么办?

提前致谢 :)

4

3 回答 3

4

我想我的答案可能符合您的需要。

第一:你必须让Node.js运行socket.io

以下是服务器的示例代码:

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(8800);  //<---------Port Number

//If No Connection / Page Error
function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

//If there is connection
io.sockets.on('connection', function (socket) {

  //Set Varible
  var UserID;
  var Old_FieldContent = "";

  socket.on('userid', function (data) { 
    if(data.id){
      UserID = data.id;
      StartGetting_FileName(UserID)
    }
  });

  //Checking New Status
  function StartGetting_FileName(UserID){

    //Create Interval for continues checking from MYSQL database
    var myInterval = setInterval(function() {

      //clearInterval(myInterval);

      //MySQL Connection
      var mysql      = require('mysql');
      var connection = mysql.createConnection({
        host     : 'localhost',
        port     : '3306',
        user     : 'root',
        password : 'ABCD1234',
        database : 'test',
      });

      //Setup SQL Query
      var SQL_Query = "SELECT FileName FROM status WHERE UserID = '"+UserID+"'";

      connection.connect();

      connection.query(SQL_Query, function(err, rows, fields) {

        //Do if old result is, different with new result.
        if(Old_FieldContent !== rows[0].FileName){
          if (err) throw err;

          //Display at Server Console
          console.log('------------------------------------------');
          console.log('');
          console.log('Fields: ', fields[0].name);
          console.log('Result: ', rows[0].FileName);
          console.log('');
          console.log('------------------------------------------');

          //Send Data To Client
          socket.emit('news', { FieldName: fields[0].name }); 
          socket.emit('news', { FieldContent: rows[0].FileName });

          //Reset Old Data Variable
          Old_FieldContent = rows[0].FileName;
        }
      });

      connection.end();
    }, 500 );
  }
});

以下是客户端 HTML 和 JS:

<!doctype html>
<html>
<head>
<title>web sockets</title>
<meta charset="utf-8">
<!-- URL PATH TO LOAD socket.io script -->
<script src="http://15.17.100.165:8800/socket.io/socket.io.js"></script>
<script>


//Set Variable
var UserID = "U00001"; 
var socket = io.connect('http://15.17.100.165:8800');
var Field_Name = "No Data";
var Field_Content = "No Data";


// Add a disconnect listener
socket.on('connecting',function() {
    msgArea.innerHTML ='Connecting to client...';
    console.log('Connecting to client...');

    //Once Connected Send UserID to server 
    //for checking data inside MYSQL
    socket.emit('userid', { id: UserID });
});


// Get data that push from server
socket.on('news', function (data) {
    console.log(data);
    writeMessage(data);
});


// Add a disconnect listener
socket.on('disconnect',function() {
    msgArea.innerHTML ='The client has disconnected!';
    console.log('The client has disconnected!');
});


//Function to display message on webpage
function writeMessage(msg) {
    var msgArea = document.getElementById("msgArea");
    if (typeof msg == "object") {
        //  msgArea.innerHTML = msg.hello;
        if(msg.FieldName !== undefined){
            Field_Name = msg.FieldName;
        }  
        if(msg.FieldContent !== undefined){
            Field_Content = msg.FieldContent;
        }  

    }else {
        msgArea.innerHTML = msg;
    }

    msgArea.innerHTML = Field_Name +" = "+ Field_Content;
}


</script>
</head>
<body>
<div id="msgArea">
</div>
</body>
</html>
于 2012-06-08T09:00:32.327 回答
1

正如上面的 K-ballo 所指出的,最好使用推送通知插件。

幸运的是,GitHub 上的一些好公民已经这样做了!

https://github.com/awysocki/C2DM-PhoneGap

请注意:上面的 C2DM 插件是为 PhoneGap v1.2 构建的,因此如果您运行的是更新版本,则必须稍微调整本机代码以使其更好地工作。

于 2012-06-05T01:19:08.830 回答
1

您应该考虑使用推送通知,Google 为 Android 提供的服务为C2DMhttps ://developers.google.com/android/c2dm/

您将需要实现一个PhoneGap插件来处理本机通知,并将它们传达给您的PhoneGap项目,然后(并且仅在那时)查询您的服务器。

于 2012-06-03T23:54:45.097 回答