我正在编写一个应用程序,一旦文件内容发生变化,服务器就会自动发送新数据,浏览器应该显示它。但是,我每次都需要使用“刷新”来查找新数据。这是客户端代码:
<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);
}
});
} );
它已经被人们用了,因为有时候它会起作用,但大部分时间它都不会在我测试时出现。我不知道是什么让它起作用。另外我打算让watchFile kindda把这个程序放在一个循环中,一旦文件内容发生变化,我就可以从中循环。
此代码也欢迎任何其他评论。我是sockets.io和node.js的新手,因此可能没有做正确的事情......提前感谢您的回答。
问题是,如何以浏览器更新数据而不在客户端刷新为止。
答案 0 :(得分: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);
});
希望这有效!