场景:
1,在一次微信餐饮开发过,需要及时知道当前流量有多少客户。这个可以即时知道准备多少食材及座次容量。
2,一般这种情况,我们使用js轮循。js轮循的
setInterval运行时一长,
每秒调用一次显示时间的Function达到动态的效果,但是运行一会浏览器卡死。所以考虑使用nodejs的socketJs 搭建长连接。
开始:
最初想法,原计划在server端,做一个循环
setInterval定时器,读服务器端的log.txt文件。如果此文件内容修改了,就向客户端输出。条件为否就轮循。最初未使用socket.在未使用socket时遇到坑,就是
错误代码:
response.writeHead(200, { 'Content-type': 'text/html' });
setInterval(function () {
fs.readFile('log.txt', function (err, data) {
var mytime = new Date().toLocaleTimeString(); //获取当前时间
if (data.toString()) {
console.log('outer success ' + mytime);
console.log(data.toString());
response.write(data.toString());
response.end();
}
});
}, 1000);
报错:
Cannot set headers after they are sent to the client。。。
就是在response.write(data.toString()); 报错。网上查好像就说response.write只能执行一次,循环就报错。按百度的修改下调nodejs的版本号和在response.write下行写上return。都不成功。
后面想到使用
socket.io,在客户端使用socket输入问题就解决了。
插入一步:
安装环境介绍:
npm install express
npm install socket
源码:
server.js
var express = require('express');
var app = express();
var http = require('http').Server(app); //将express注册到http中
var io = require('socket.io')(http);
var fs = require("fs");
app.get('/', function (req, response) {
response.sendFile(__dirname+"/index.html"); //加载index view
// response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
//response.writeHead(200, { 'Content-type': 'text/html' });
// io.on('connection', function (socket) {
// //new addition
// });
var last_msg ;
setInterval(function () {
fs.readFile('log.txt', function (err, data) {
var mytime = new Date().toLocaleTimeString(); //获取当前时间
new_msg = data.toString();
if (new_msg) {
console.log('outer success ' + mytime);
console.log(new_msg);
if (last_msg != new_msg) {
io.emit("message",mytime+" : "+ new_msg) //将新消息广播出去
last_msg = data.toString();
}
}
});
}, 1000);
});
//启动监听,监听3000端口
http.listen(8080, function () {
console.log('listening on *:8080');
return ;
});
index.html
<!doctype html>
<html>
<head>
<title>Socket.IO chat</title>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<h1>后端向前端单向传消息</h1>
<ul id="messages"></ul>
</body>
<script>
var socket = io();
//发送昵称给后端
// socket.emit("join", name)
//接收到服务器发来的message事件
socket.on("message", function (msg) {
$('#messages').append($('<li>').text(msg));
})
</script>
</html>
说明:
var socket = io();
//发送昵称给后端
//socket.emit("join", name)
//只单向接收到服务器发来的message事件
socket.on("message", function (msg) {
$('#messages').append($('<li>').text(msg));
})
log.txt文件为服务器端的文件,通过手工修改,保存即可。
演示:
根据上面的文档及演示,可以考虑使用数据库表变动将信息通知到前端。省。
转载于:https://my.oschina.net/7795442/blog/3017382