我正在编写一个应用程序,一旦文件内容发生变化,服务器就会自动发送新数据,并且浏览器应该显示它。但是,我每次都需要使用“刷新”来找出新数据是什么。这是客户端代码:
<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 将该程序放入一个循环中,这样我就可以在文件内容发生更改时立即发出信号。
也欢迎对此代码提出任何其他评论。我是 sockets.io 和 node.js 的新手,因此可能没有做正确的事情......提前感谢您的回答。
问题又来了,如何才能让浏览器更新数据而不刷新客户端。
最佳答案
你的方法不好,但这不是问题,因为你说你是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);
});
希望这有效!
关于node.js 无需刷新即可获取新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21768579/