2014-02-14 5 views
1

Я пишу приложение, где сервер будет автоматически отправлять новые данные, как только содержимое файла будет изменено, и браузер должен отобразить его. Тем не менее, мне нужно каждый раз «обновлять», чтобы узнать, что такое новые данные. вот код клиента:node.js получить новые данные без обновления

<script> 
var socket = io.connect('http://192.168.1.91:8070'); 
socket.on('news', function (data) { 
       console.log(data); 
       document.forms['test form'].elements["txtStatus"].value = data; 
}); 
</script> 

и вот код сервера:

var http = require('http'); 
var io = require('/home/pi/node/lib/node_modules/socket.io'); 
var server; 
var fs = require('fs'); 

server = http.createServer(function(req, res){ 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.write('My first node app.'); 
    res.end(); 
}), 

server.listen(8070); 

var io = io.listen(server); 

var prev_text; 
var text = fs.readFileSync('./current_temp','utf8'); 

io.sockets.on('connection', function (socket) { 

socket.emit('news', text); 
fs.watchFile('./current_temp', function (curr, prev) { 
text = fs.readFileSync('./current_temp','utf8'); 
     if(prev_text != text){ 
       prev_text = text; 
       socket.emit('news', text); 
       console.log("text is :"+text); 
     } 
}); 


}); 

это weired, потому что иногда это работает, но в большинстве случаев это не когда я тестирую его. Я понятия не имею, что заставляет его работать. Кроме того, я намеревался, что watchFile kindda помещает эту программу в цикл, из которого я могу создавать испускания, как только изменяется содержимое файла.

Также любые другие комментарии приветствуются по поводу этого кода. Я новичок в sockets.io и node.js, и поэтому может не делать что-то правильно ... Спасибо заранее за ответ.

Вопрос еще раз, как я могу сделать его таким образом, чтобы браузер обновлял данные без обновления на стороне клиента.

+0

Одно замечание общего характера заключается в том, что вы должны избегать как можно большего количества функций синхронизации, особенно readFileSync. Node.js не блокируется, и как вы его используете, вы блокируете весь сервер (однопоточный, помните?), Пока этот файл не будет прочитан. Не очень классный для производительности. – Zlatko

+0

Кроме того, я думаю, что ваша проблема может заключаться в том, что вы хотите вытащить переменную сокета, чтобы она не срабатывала как с обратным вызовом watchFile, так и с обратным вызовом socket.on ('connection'). А также, я бы посмотрел на модели того, когда это работает. Если вы попытаетесь сохранить изменения файла перед первым подключением, работает ли обновление? Или только один раз после первого подключения к socket.io? – Zlatko

+0

Вы правы в сохранении изменений, он работает в одном из случаев, но я не могу понять, когда, я просто видел его пару раз. Что касается вытаскивания гнезда из socket.on, я попытался, но это не сработало. вот что я пробовал: var global_sock; io.sockets.on ('connection', function (socket) { \t global_sock = socket; }); global_sock.emit ... но по какой-то причине это не сработало. возможно, вы могли бы рассказать мне, как вытащить его? – user3299502

ответ

2

Ваш подход не является хорошим, но это не проблема, поскольку вы сказали, что новичок в socket.io. Вам нужно обновить страницу, потому что вы не используете события по умолчанию socket.io. Когда вы обновляете страницу, между клиентом и сервером происходит новое соединение, и вы запускаете свое мероприятие «новости». Делают это так:

var prev_text; 
var text = fs.readFileSync('./current_temp','utf8'); 
fs.watchFile('./current_temp', function (curr, prev) { 
text = fs.readFileSync('./current_temp','utf8'); 
    if(prev_text != text){ 
      prev_text = text; 
      io.sockets.emit('news', text); 
      console.log("text is :"+text); 
    } 
}); 
io.sockets.on('connection', function (socket) { 
    socket.emit('news', text); 
}); 

io.sockets.emit это событие по умолчанию, которое выдает данные для всех подключенных клиентов, и вы можете использовать его из сферы io.sockets.on('connection')

Я думаю, что вы можете обнаружить файл изменить с помощью chokidar.js. Каждый раз, когда ваш файл изменяется, будет запущено событие, и вы можете запустить свое событие «новости». Кроме того, вы можете обнаружить его с этим:

fs.watch("c:\\sim", { persistent: true }, function (event, fileName) { 
console.log("Event: " + event); 
io.sockets.emit('news', text); 
}); 

Надеется, что это работает!

+0

На самом деле в старом кодексе после того, как я удалил условный оператор «if», он начал работать.Я думаю, что я попробовал вашу версию, но это не сработало, но я попробую еще раз завтра. С вашим подходом, как я запускаю событие sockets.on для запуска emmit, как только файл будет обновлен? Я не вижу этого в коде ... – user3299502

+0

Мне жаль, что я этого не заметил, я отредактировал свой ответ –

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