mysql视频 Linux软件安装 JDK动态代理 NTFS权限 Transformer delphi plugins highcharts sqlalchemy vue图表 jquery循环遍历 bootstrap侧边栏 matlab中log函数 android调试工具 mysql增删改查语句 清空input文本框的值 arraylist删除指定元素 string转16进制 excel带格式复制粘贴 java开发环境配置 java获取ip地址 java求阶乘 java获取时间 javaenum java创建文件夹 javalist数组 java网络编程 圣骑士装备 js删除数组指定元素 源计划卡特 倒计时计时器 网络克隆 adobe卸载工具 js字符转数字 子节点 挑战程序设计竞赛 deallocate fireworks 燃烧之血十字架 ass转srt
当前位置: 首页 > 学习教程  > 

Nodejs后端推送消息

2020/10/16 18:00:00 文章标签: nodejs后端开发

2019独角兽企业重金招聘Python工程师标准>>> 场景: 1,在一次微信餐饮开发过,需要及时知道当前流量有多少客户。这个可以即时知道准备多少食材及座次容量。 2,一般这种情况,我们使用js轮循。js轮循的 setInt…

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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


本文链接: http://www.dtmao.cc/news_show_300266.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?