1、页面 与 js :
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>WebSocket Echo Demo</title> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link href="../bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" /> <script src="../js/jquery-1.12.3.min.js"></script> <script src="../bootstrap-3.3.5/js/bootstrap.min.js"></script> </head> <body> <div class="vertical-center" id="test"> <div class="container"> <h1>Stock Chart over WebSocket</h1> <div>{{message}}</div> <!--<button class="btn btn-primary">开始</button> <button class="btn btn-danger">停止</button>--> <table class="table" id="stockTable"> <thead> <tr> <th>Symbol</th> <th>Price</th> </tr> </thead> <tbody id="stockRows"> <tr> <td> <h3>售票数</h3> </td> <td id="sale"> <h3><span class="label label-default" id="num1">{{numData}}</span></h3> </td> </tr> </tbody> </table> </div> </div> <script> var ws = new WebSocket("ws://localhost:8181"); var stock_request = { "stocks": ["AAPL", "MSFT", "AMZN", "GOOG", "YHOO"] }; var isClose = false; var stocks = { "AAPL": 0, "MSFT": 0, "AMZN": 0, "GOOG": 0, "YHOO": 0 }; function updataUI() { // debugger ws.onopen = function (e) { console.log('Connection to server opened'); isClose = false; //ws.send(JSON.stringify(stock_request)); //ws.send('plese to conection'); //console.log("sened a mesg"); } // UI update function var changeStockEntry = function (symbol, originalValue, newValue) { var valElem = $('#' + symbol + ' span'); valElem.html(newValue.toFixed(2)); if (newValue < originalValue) { valElem.addClass('label-danger'); valElem.removeClass('label-success'); } else if (newValue > originalValue) { valElem.addClass('label-success'); valElem.removeClass('label-danger'); } } // WebSocket message handler ws.onmessage = function (e) { var stocksData = JSON.parse(e.data); console.log(stocksData); for (var symbol in stocksData) { if (stocksData.hasOwnProperty(symbol)) { changeStockEntry(symbol, stocks[symbol], stocksData[symbol]); stocks[symbol] = stocksData[symbol]; } } }; } //updataUI(); $(".btn-primary").click(function () { if (isClose) { ws = new WebSocket("ws://localhost:8181"); } updataUI(); }); $(".btn-danger").click(function () { ws.close(); }); ws.onclose = function (e) { console.log("Connection closed", e); isClose = true; }; </script> <script src="config/jquery-1.10.2.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> var app2 = new Vue({ el: '#test', data: { message: '页面加载于 ' + new Date().toLocaleString(), numData: 0, }, mounted: function () { }, methods: { init() { //debugger that = this; var ws = new WebSocket('ws://localhost:8181'); ws.onopen = function (e) { console.log('开始连接服务器') // 发送消息 ws.send('连接到服务器'); } ws.onmessage = function (event) { // 监听消息 //debugger //定时器设置数字变化的滚动效果 var number = event.data - that.numData; var boo = number > 0 ? true : false;// boo = true动画效果为递增;boo = false动画效果为递减 setInterval(function () { if (boo) { //数字变大 number--; if (number >= 0) { that.numData++; return that.numData; } }else { //数字变小 number++; if (number <= 0) { that.numData--; return that.numData; } } }, 1); //that.numData = event.data;直接赋值没有动画效果,想要动画效果采用上面方法 console.log("监听到消息:" + that.numData); //that.numData = msg.data.salesNum; } ws.onerror = function (evt) { //产生异常 console.log("产生异常"); }; ws.onclose = function (evt) { //产生异常 console.log("关闭"); }; }, }, created: function () { this.init(); } }); </script> </body> </html>
nodejs 搭建server.js服务 :
var WebSocketServer = require('ws').Server, wss = new WebSocketServer({ port: 8181 }); //引入模块 var http = require('http'); const querystring = require('querystring'); var numData = -1; var isTrue = false; var clientStockUpdater; //定义请求消息头 var headers = { 'XverifyApi': 'fzY08dHMxkRRaDM9m7y+ptFf9qsVzmLb0enT7NRfBdAhtI0+iKv3Sg==', 'XownerId': 'fqszs', 'XsysId': 'sys-0' }; //定义请求消息url和头部 var options = { method: 'GET', url: 'http//api.whlyw.net/bo/api/v1/big-data-ticket-market/list/res/sales', headers: headers }; function handleGetData() { //发送请求 var request = require('request'); //console.log("33"); request({ url: 'http://api.whlyw.net/bo/api/v1/big-data-ticket-market/list/res/sales', method: 'GET', headers: headers }, function (error, response, body) { // console.log(response.statusCode) if (!error && response.statusCode == 200) { // console.log(JSON.parse(body)) // 请求成功的处理逻辑,注意body是json字符串 .data.salesNum console.log('页面数' + numData); console.log('售票数'+JSON.parse(body).data.salesNum); if (numData == JSON.parse(body).data.salesNum) { console.log('进入到页面数与售票数一致的方法中'); isTrue = false; } else { console.log('进入到页面数与售票数不一致的方法中'); numData = JSON.parse(body).data.salesNum isTrue = true; } //console.log(numData); //return numData; } }) //request(options, function (error, response, body) { // console.log("33"+response.statusCode); // if (!error && response.statusCode == 200) { // console.log(body) // 请求成功的处理逻辑,注意body是json字符串 // } //}); //var req = http.request(options, function (res) { // console.log(res.statusCode); // console.log(res.headers); // res.setEncoding('utf-8'); // res.on('data', function (chunk) { // //输出响应内容 // console.log("GGG"+chunk); // ////将chunk转为对象 // //console.log(JSON.parse(chunk)); // ////通过对象调用各参数,不发散其他操作 // //console.log(JSON.parse(chunk).resultcode); // }); // //res.on('end', function () { // // console.log('响应结束********'); // //}); //}); ////监控错误情况时报错 //req.on('error', function (e) { // console.error(e); //}); ////结束请求输入 //req.end(); } wss.on('connection', function (ws) { var sendStockUpdates = function (ws) { //console.log("11", ws.readyState); if (ws.readyState == 1) { var stocksObj = {}; // console.log("第一次"); handleGetData(); console.log("dd" + isTrue); if (isTrue) { console.log("发送前"); ws.send(JSON.stringify(numData)); } } } ws.on('message', function (message) { //var stockRequest = JSON.parse(message); var stockRequest = message; console.log("收到消息", stockRequest); //clientStocks = stockRequest['stocks']; //sendStockUpdates(ws); //setInterval第一次执行时会延迟对应时间,所以这里先执行该方法;如果每秒轮询就不用下面操作,下面的请求接口还有回调需要时间来的延迟 //if (ws.readyState == 1) { // var stocksObj = {}; // handleGetData(); // console.log("dd" + isTrue); // if (!isTrue) { // console.log("发送前"); // ws.send(JSON.stringify(numData)); // } //} clientStockUpdater = setInterval(function () { // console.log("第二次"); sendStockUpdates(ws); }, 1000); }); ws.on('close', function () { if (typeof clientStockUpdater !== 'undefined') { clearInterval(clientStockUpdater); } }); });
备注:
1、cmd打开命令窗口,进入到nodejs安装目录下,执行全局安装request模块命令:
npm i request -g 。
2、进入到项目所在目录执行启动node服务命令:node server.js。
3、再浏览器打开页面 初始化并创建websocket长连接,实时监听数据变化。