android - 客户端 Android Phonegap 应用程序的实时状态更新

标签 android cordova tcp socket.io

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

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

提前致谢:)

最佳答案

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

第一:你必须得到 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>

关于android - 客户端 Android Phonegap 应用程序的实时状态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840824/

相关文章:

android - Android Studio 0.3.1错误:配置项目时出现问题

android - 如何以编程方式检查图像(PNG、JPEG)在 Android 中是否已损坏或不受支持?

java - 通过套接字连接的多个 HTTP 请求

c - 使用 TCP/IP : recv() blocks 的套接字编程

java - 如何设置 Spring TCP 客户端和服务器模型?

android - Facebook 贴到墙上的异常(exception)情况

javascript - 在 Phonegap Android 中存储值的最简单方法

android - 苹果操作系统 : cordova platform add android

android - cordova 文件传输插件下载未显示在图片库中

android - 键盘出现时 ActionBar 隐藏