2012-05-31 6 views
2

Я пытаюсь найти лучший способ отправить моим пользователям статус обновления состояния процесса, выполняющегося на моем сервере, - это процесс разбит на пять частей. Прямо сейчас я просто «вытягиваю» статус, используя вызов Ajax каждые несколько секунд, в файл PHP, который подключается к MySQL и читает статус, но, как вы можете себе представить, это очень сложно в моей базе данных и не работает так хорошо с пользователями, у которых нет сильного интернет-соединения.Обновление статуса в реальном времени на Android Android Phonegap App

Итак, я ищу решение, которое будет «нажимать» данные моему клиенту. У меня теперь работает push-engine APE на моем сервере, но я предполагаю, что Socket.IO лучше для этого? Что делать, если они находятся в сети 3G, и они пропускают обновление статуса?

Заранее спасибо :)

ответ

5

Я думаю, что мой ответ может совпадать с тем, что вам нужно.

первый: Вы должны получить 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); 
    } 
}); 

НИЖЕ IS КЛИЕНТ 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> 
+0

Спасибо, это было то, что я искал (: ли перечисленные выше node.js отправляют данные всем клиентам, подключенным к порту 8800 или только к подключенному клиенту? Также есть способ выполнить файл node.js (который записывает в локальный сокет, возможно?), когда я хочу обновить статус, а не читать статус из базы данных mysql? Спасибо! – AustinAllover

+0

** Вышеупомянутые node.js отправляют данные всем клиентам, подключенным к порту 8800 или только к подключенному клиент? ** Да, для «Socket.emit», он отправляет все данные всем клиентам, таким как вещание. Если вы хотите его отправить индивидуально, вы можете попытаться применить это: Node.JS - Серверный скрипт (* Не полностью протестирован) "io.sockets.sockets [socket.id] .emit ('data' , {FieldName: fields [0] .name}); " –

+0

или MySQL с оригинальным скриптом (* Протестировано на MySQL - Сервер - Клиент) " socket.emit ('data', {FieldName: fields [0]. name}); " Если пользовательский идентификатор клиента установлен по-разному для каждого отдельного соединения, он не может конфликтовать с другими пользователями. Однако по соображениям безопасности применять «socket.id», как указано выше, на каждом событии отправки должно быть хорошей практикой. –

0

Вы должны рассмотреть возможность использования уведомления толчка с сервисом, предоставляемым для Android от Google, как C2DM: https://developers.google.com/android/c2dm/

Вам нужно будет реализовать PhoneGap плагина для обработки собственных уведомлений и передачи их в ваш проект PhoneGap, который затем (и только потом) запросит ваш сервер.

+0

Спасибо за ответ. Но я не ищу уведомления, я ищу больше таких решений, как Socket.IO, и получаю обновления. – AustinAllover

+0

Это просто кажется слишком большим для того, что мне нужно. Пятиэтапный процесс займет около 1 минуты, и пользователь должен оставаться внутри приложения на экране загрузки, пока на экране загрузки отображается, на каком этапе приложение включено. Понимаете, что я говорю? – AustinAllover

1

Как K-ballo выше указано, использование плавного уведомления плагина было бы лучше.

К счастью, хороший гражданин на GitHub уже сделал это!

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

Пожалуйста, обратите внимание: выше C2DM плагин был построен для PhoneGap v1.2, так что если вы используете версию более уточненный вам придется настроить нативный код немного, чтобы получить его работая лучше.

Смежные вопросы