socket.io实践(一.实现简单的图表推送)

引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器。但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素。

研究本例主要为后期BI软件,CRM图标系统使用nodejs socket做铺垫.主要实现的是一个分析表图的推送。

socketio.io 代码库以及官网

https://github.com/socketio/socket.io

http://socket.io/

使用redis来实现集群读写 消息 (采用订阅 分发的策略)

https://github.com/socketio/socket.io-redis

在非socket客户行为中发送socket事件(本例在http中调用)

https://github.com/socketio/socket.io-emitter

1.安装和基本使用 npm install socketio.io --save

使用因为本人写的例子是Express照搬官网说明

var app = require(‘express‘)();
var server = require(‘http‘).createServer(app);
var io = require(‘socket.io‘)(server);
io.on(‘connection‘, function(){ /* … */ });
server.listen(3000);

  

2.使用websocket初始化一个echart的图片

socket.js 简单封装下socket.io的一些基本功能

var mockData = [
    [10, 52, 200, 334, 390, 330, 220]
];

var ioCreater = function(server) {
    var io = require(‘socket.io‘)(server);
    io.on(‘connection‘, function (socket) {
        socket.emit(‘init chart data‘, {data:mockData[0]});   //socket客户端发送一个消息 init chart data ,内容为一组数据
        socket.on(‘disconnect‘, function(){
            console.log(‘user disconnected‘);
        });
        socket.on(‘message‘, function(){
            console.log(‘received a message‘);
        });
        socket.on(‘connect‘, function(){
            console.log(‘connect a socket client‘);
        });

    });
var redis = require(‘redis‘);var adapter = require(‘socket.io-redis‘);var pub = redis.createClient({host:"192.168.0.13", port:"6379", password: "123456" });var sub = redis.createClient({host:"192.168.0.13", port:"6379", password: "123456" ,return_buffers: true});io.adapter(adapter({ pubClient: pub, subClient: sub }));
return io; } module.exports = ioCreater;

 

app.js express项目主入口,创建8080端口web服务器的时候创建一个socket服务

var socket = require(‘./socket/socket‘);

var port = normalizePort(process.env.PORT || ‘8080‘);
app.set(‘port‘, port);
var server = http.createServer(app);
var io = socket(server);
server.listen(port);

推送入口,一个express的路由charts.js

var express = require(‘express‘);
var router = express.Router();
var server =  express();
server.use(‘/charts‘, router);
var emitter = require(‘../tools/socket.io-emitter.js‘);  //此处修改来自socket.io-emitter.js

var mockData = [
    [10, 52, 200, 334, 390, 330, 220],
    [10, 52, 200, 334, 390, 330, 220],
    [88, 32, 87, 432, 4, 30, 87],
    [42, 52, 87, 23, 390, 42, 87],
    [42, 52, 200, 334, 390, 42, 876],
    [53, 52, 321, 324, 42, 330, 32],
    [44, 87, 4, 32, 390, 42, 32],
    [53, 87, 42, 334, 54, 330, 220],
    [530, 52, 54, 43, 43, 330, 32],
    [88, 13, 233, 98, 43, 44, 32]
];

var count =1;

const disableLayout ={layout: false};

// disable interface layout.hbs  user config layout: false
router.get(‘/simpleBarChart‘, function(req, res, next) {
    var result = Object.assign({title: ‘chart demo‘},disableLayout);
    res.render(‘charts/simpleBarChart‘,result);
});

router.get(‘/pollingChartData‘, function(req, res, next) {
    //10.10.10.96:8080
    var io = emitter({ host: ‘192.168.0.13‘, port: 6379, password: "123456"  });
    setTimeout(function(){
        count++;
        io.emit(‘init chart data‘, {data:mockData[count%10]});
        res.render(‘index‘, { title: ‘推送一条消息成功!‘});
    }, 500);

});

module.exports = server;

  

  

前端页面

<!DOCTYPE html>
<html>
<head>
    <!-- 声明文档使用的字符编码 -->
    <meta charset=‘utf-8‘>
    <!-- 优先使用 IE 最新版本和 Chrome -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <!-- 启用360浏览器的极速模式(webkit) -->
    <meta name="renderer" content="webkit">
    <!-- 页面描述 -->
    <meta name="description" content="chart demo"/>
    <!-- 页面关键词 -->
    <meta name="keywords" content="chart demo"/>
    <!-- 网页作者 -->
    <meta name="author" content="name, [email protected]"/>
    <!-- 搜索引擎抓取 -->
    <meta name="robots" content="index,follow"/>
    <!-- 为移动设备添加 viewport -->
    <meta name="viewport" content="initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no">
    <title>chart</title>
    <link rel=‘stylesheet‘ href=‘/css/style.css‘/>
    <link rel=‘stylesheet‘ href=‘/css/charts/charts.css‘/>
    <script type="text/javascript" src="/js/library/echart/3.3.2/echarts.min.js"></script>
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>

</head>
<body>
<div class="chart-wrap" id="chart-wrap"></div>
<script type="text/javascript">
    var mychart = echarts.init(document.getElementById("chart-wrap"));
    var option = {
        color: [‘#3398DB‘],
        tooltip: {
            trigger: ‘axis‘,
            axisPointer: {            // 坐标轴指示器,坐标轴触发有效
                type: ‘shadow‘        // 默认为直线,可选为:‘line‘ | ‘shadow‘
            }
        },
        grid: {
            left: ‘3%‘,
            right: ‘4%‘,
            bottom: ‘3%‘,
            containLabel: true
        },
        xAxis: [
            {
                type: ‘category‘,
                data: [‘Mon‘, ‘Tue‘, ‘Wed‘, ‘Thu‘, ‘Fri‘, ‘Sat‘, ‘Sun‘],
                axisTick: {
                    alignWithLabel: true
                }
            }
        ],
        yAxis: [
            {
                type: ‘value‘
            }
        ],
        series: [
            {
                name: ‘直接访问‘,
                type: ‘bar‘,
                barWidth: ‘60%‘,
                data: [10, 52, 200, 334, 390, 330, 220]
            }
        ]
    };

    var drawChart = function(data){
        option.series[0].data = data;
        mychart.setOption(option);
    };

    var socket = io("ws://10.10.10.96:8080");
    socket.on(‘disconnect‘, function(){
        console.log(‘user disconnected‘);
    });
    socket.on(‘message‘, function(){
        console.log(‘received a message‘);
    });
    socket.on(‘connect‘, function(){
        console.log(‘connect a socket client‘);
    });
    socket.on(‘init chart data‘, function(data){
        console.log(‘init chart data‘);
        drawChart(data.data);
    });
    socket.on(‘new chart data‘, function(data){
        console.log(‘new chart data‘);
        drawChart(data.data);
    });

</script>
</body>
</html>

  

最后结果,通过http://localhost:8080/charts/simpleBarChart访问获得一个简单的echart图表,

通过http://localhost:8080/charts/pollingChartData访问推送新数据重绘图表,每次发送一次请求,重新绘制一次图片。

时间: 2024-11-01 22:59:00

socket.io实践(一.实现简单的图表推送)的相关文章

企业微信简单实现消息推送

废话不多说,上来就堆代码.......... 感觉挺简单,就不过多解释,应该一看就懂..... import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.client.met

C# 简单的百度推送代码

前段时间搞推送来着,安卓方面用到了百度的推送服务,由于只是简单的用到安卓推送的通知功能,所以没用百度推荐的C# SDK,通过借鉴网上的各种资料和百度的API,费了老大劲终于折腾出来一段能用的代码(早知道这么纠结,直接用别人的了...强迫症伤不起啊) /// <summary> /// 百度推送 /// </summary> public class BaiduPush { private const string method = "push_msg"; pri

python简单爬虫定时推送同花顺直播及荐股至邮箱

1.初衷:实践 2.技术:python requests Template 3.思路:根据直播页面获取评价最高的前十博主,定时爬行最新的消息和实战股票 4.思路:python 编辑简单邮件html模板 5.难点:邮件html模板的设计,还需要邮箱支持 爬虫文件 '''-- #coding:utf-8import requestsfrom lxml import etreefrom sendmail import sendmailimport sys, timefrom string import

为Phonegap Android平台增加websocket支持,使默认成为socket.io首选通

为Phonegap Android平台增加websocket支持,使默认成为socket.io首选通道选择 广而告之 使用socket.io作为跨浏览器平台的实时推送首选,经测试在各个主流浏览器上测试都确实具有良好的下实时表现.这里为推广socketio-netty服务器端实现哈,做次广告,同时预热一下: socketio-netty : 又一款socket.io服务器端实现,兼容0.9-1.0版本~ 示范目的 我们要构建一个在市面上常见浏览器上都可以正常运行的集体聊天应用,保证在IE6+,Fi

socket.io-直播视频的消息推送

近日接到需求,需要在"直播后台监控系统"里监控直播间的消息.刚接到需求时一脸懵逼,好在队友给力,Google强大,需求已经上线.现将我完成需求的过程与查阅了解到的知识整理出来,仅供参考,若错误请指教~~ 一.什么是WebSocket WebSocket一种在单个TCP连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范,WebSocketAPI被W3C定为标准. WebSocket 是独立的.创建在 TCP

[转载]使用node.js+socket.io搭建实时消息系统

在开发web应用时,经常会有消息接收需求.例如后台处理完某个任务,需要告知用户等.一个简单的做法,是使用ajax轮询.这样带来的问题一是低效,二是消息触达不够实时.另一个方法是使用websocket来接收消息,但可惜IE不支持这种方式.下面推荐一种既能实时接收消息,又能兼容各种浏览器的方案,那就是node.js+socket.io. node.js的异步非阻塞模型,做消息推送非常合适.socket.io则负责屏蔽浏览器的差异,其会选择性的使用下列方式建立连接:websocket, flash s

Socket.IO聊天室

小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ Socket.IO聊天室 简介:Socket.IO实现了实时双向的基于事件的通讯机制.旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制.下面我们使用Node.js和Socket.IO来做一个简单的聊天室.一.初始化项目 (这个是在实验楼网站的虚拟平台需要实现的~可自动略过这一环节,

Socket.io的集群方案

介绍 Nodejs因其简单方便,在服务端应用市场也开始占有一席之地,其另外一个分支--socket.io(最后跟nodejs好像又要合并了),特别适合聊天室.白板(document collabration).在线实时计算.计数器等应用,如果要支持大容量应用,就需要使用集群技术了,下面逐一讨论常见的socket.io集群方案. 集群方案 在官网介绍的方案有使用ngix反向代理方案.这种方案比较简单不需要修改业务代码可以直接布署,通过iphash轮调算法保存用户分配到同一个进程. vi /etc/

Web端服务器推送技术原理分析及dwr框架简单的使用

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系