【问题标题】:Real-time Status Update on Client Android Phonegap App客户端Android Phonegap App上的实时状态更新
【发布时间】:2012-05-31 20:30:43
【问题描述】:

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

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

提前致谢:)

【问题讨论】:

    标签: android cordova tcp socket.io


    【解决方案1】:

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

    第一个:您必须获得 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>
    

    【讨论】:

    • 谢谢,这就是我要找的(:上面的node.js是向连接在端口8800上的所有客户端发送数据还是只向连接的客户端发送数据?另外,有没有办法执行一个 node.js 文件(可能会写入本地套接字?)每当我想更新状态而不是从 mysql 数据库中读取状态时?谢谢!
    • 上面的node.js是向所有连接在8800端口的客户端发送数据还是只向连接的客户端发送数据?是的,对于“Socket.emit”,它发送所有数据对所有客户喜欢广播。如果您希望它单独发送,您可以尝试应用此:Node.JS - 服务器脚本(*尚未完全测试)“io.sockets.sockets[socket.id].emit('data', { FieldName: fields [0].name }); "
    • 或带有原始脚本的 MySQL (*Tested on MySQL - Server - Client) "socket.emit('data', { FieldName: fields[0].name }); " 如果来自客户端的 UserID为每个单独的连接设置不同的,它可能不会与其他用户冲突。但是,出于安全原因,在每个发送事件上应用上述“socket.id”应该是一个好习惯。
    • 还有,有没有办法执行 node.js 文件 我正在使用一种简单的方法来执行它,即创建一个快捷方式文件并在每次系统启动时运行它-向上。把这个放在快捷方式的目标上:“C:\Program Files\nodejs\node.exe” server.js
    • **通过使用“io.sockets.sockets[socket.id].emit” ** 使用“io.sockets.sockets[socket.id].emit”的 SetTimeOut / Interval 存在一些问题" ...由于如果赛季断开连接,将导致 Node.JS 上的错误
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答。但我不是在寻找通知,而是在寻找更多解决方案,例如 Socket.IO 打开并接收更新。
    • 这对我的需要来说似乎有点太多了。这 5 个步骤的过程总共需要大约 1 分钟,并且用户需要在加载屏幕上停留在应用程序内,而加载屏幕会显示应用程序正在执行的步骤。明白我在说什么吗?
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-09
      • 2011-06-08
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多