场景:
 
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文件为服务器端的文件,通过手工修改,保存即可。
 
演示:
 
Nodejs后端推送消息
 
 
根据上面的文档及演示,可以考虑使用数据库表变动将信息通知到前端。省。
 

转载于:https://my.oschina.net/7795442/blog/3017382

相关文章:

  • 2021-12-28
  • 2022-12-23
  • 2021-09-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-04
猜你喜欢
  • 2021-12-05
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
相关资源
相似解决方案