День добрый!
В JS и прочих ЯВУ писал ранее только линейно, Node стал испытанием при решении простейшей задачки:
1. Пользователь открывает рамочную страницу, при установке коннекта через WS ему дают первую порцию данных из базы (getValuesFull). На той стороне данные парсят и выводят.
2. Каждые пять секунд вычисляется разница на стороне сервера и передается через WS в браузер эта самая дельта(getValues). В клиенте данные парсятся и выводятся как и в п.1
Это всё что надо, только одна функция у WS.
Опостылевший пожалуй уже всем пример чата запилил под себя, mysql подсоединил, написал процедуры и сделал кнопку "обновить" в браузере(была в примерчике "Отправить"), при её нажатии всё прилетает как надо.
В конце кода в комментариях моё видение вопроса с бесконечным циклом, но оно не работает, либо сразу в цикл, либо +1 клиент и тоже туда и выхода нет оттуда, обновления не ходят и лог не пишет.
Подскажите, как эту кнопку "нажимать" на сервере каждые 5 секунд, а то если все клиенты будут со стороны браузера дергать будет совсем некрасиво и тяжело для базы.
Заранее спасибо!
var WebSocketServer = new require('ws');
// подключенные клиенты
var clients = {};
var clientsCount = 0;
var mysql = require('mysql');
var mysqlConnection = mysql.createConnection({
database : '***',
user : '***',
password : '***',
stringifyObjects : true,
socketPath : '/tmp/mysql.sock'
});
// WebSocket-сервер на порту 8081
var webSocketServer = new WebSocketServer.Server({port: 8081});
webSocketServer.on('connection', function(ws) {
var id = Math.random();
clients[id] = ws;
clientsCount++;
console.log("new connect " + id + ', total ' + clientsCount);
getValuesFull(sendBroadcast);
ws.on('message', function(message) {
getValues(sendBroadcast);
});
ws.on('close', function() {
clientsCount--;
console.log('connection is closed ' + id + ', total ' + clientsCount);
delete clients[id];
});
});
function sendBroadcast(newValues_){
for(var key in clients) {
clients[key].send(newValues_);
};
};
function getValues(callback){
strQuery = "call getValues";
mysqlConnection.query( strQuery, function(err, rows){
if(err) {
throw err;
}else{
try{
callback(rows[0][0]['value']);
}catch(e){
}
}
});
};
function getValuesFull(callback){
strQuery = "call getValuesFull";
mysqlConnection.query( strQuery, function(err, rows){
if(err) {
throw err;
}else{
try{
callback(rows[0][0]['value']);
}catch(e){
}
}
});
};
function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
};
//while(1){
//if(clientsCount){
// getValues(sendBroadcast);
// sleep(5000);
//};
//};