Показать сообщение отдельно
  #1 (permalink)  
Старый 04.11.2014, 15:00
Новичок на форуме
Отправить личное сообщение для Webnode Посмотреть профиль Найти все сообщения от Webnode
 
Регистрация: 12.01.2014
Сообщений: 6

Node & Websockets - посылка значений в бесконечном цикле
День добрый!

В 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);
//};
//};
Ответить с цитированием