2

サーバーで実行されているプロセスのステータス更新をリアルタイムでユーザーに送信するための最良の方法を見つけようとしています。このプロセスは5つの部分に分かれています。現在、MySQLに接続してステータスを読み取るPHPファイルに数秒ごとにAjax呼び出しを使用してステータスを「プル」していますが、ご想像のとおり、これは私のデータベースでは非常に困難であり、機能しません。強力なインターネット接続を持たないユーザーにも適しています。

そのため、データをクライアントに「プッシュ」するソリューションを探しています。サーバーでAPEプッシュエンジンを実行していますが、Socket.IOの方が適していると思いますか?彼らが3Gを使用していて、ステータスの更新を見逃した場合はどうなりますか?

前もって感謝します :)

4

3 に答える 3

4

私の答えはあなたが必要としているものと一致するかもしれないと思います。

1番目:socket.ioを実行するにはNode.jsを取得する必要があります

以下はサーバーのサンプルコードです。

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

GoogleがC2DMとしてAndroidに提供するサービスでプッシュ通知の使用を検討する必要があります:https ://developers.google.com/android/c2dm/

ネイティブ通知を処理するためにPhoneGapプラグインを実装し、それらをPhoneGapプロジェクトに伝達して、サーバーにクエリを実行する必要があります。

于 2012-06-03T23:54:45.097 に答える
1

上記のK-balloが指摘しているように、プッシュ通知プラグインを使用するのが最適です。

幸いなことに、GitHubの一部の善良な市民はすでにこれを行っています!

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

注意:上記のC2DMプラグインはPhoneGap v1.2用に構築されているため、より最新のバージョンを実行している場合は、ネイティブコードを少し調整して機能を向上させる必要があります。

于 2012-06-05T01:19:08.830 に答える