继续昨天未完成的博客。
signalr是c#下的一种服务器与客户端通信技术。基于长轮询。(据官方文档描述,可以根据具体浏览器选择使用长轮询或者web socket)使用非常方便。
先展示结果:
然后我用一个客户端模拟新数据插入,即向服务器发送了一个新数据。服务器会给所有的浏览器发送响应,浏览器拿到数据后通过脚本更新图表。
我输入一条信息后,再看浏览器,会自动刷新图表。只有当我有输入后,浏览器才会更新数据。
可以看到已经变化了。我输了三次数据,浏览器就会更新三个记录。对所有用户有效。测试前,可以分别用ie ,firefox 打开到本地服务器这个页面。可以看到所有浏览器都已经更新。
结合上一篇博客说到的数据库推送技术,只要将客户端换成dll加载到 数据库触发器,便可以实现,新数据插入后,页面实时展示。
这里先把本次的demo代码贴出来。
客户端的代码,这些都是从highcharts官方贴过来的,简单修改了一些。这个图表中共有三条曲线,我发现每次同时更新三条曲线会有一个问题,highcharts的线条前进动画没了。只能一条条绘制,所以就用了fadeTogge的回调函数,竟然有效!
<head> <script src="http://code.jquery.com/jquery-1.7.min.js" type="text/javascript"></script> <script src="~/Scripts/jquery.signalR-1.0.1.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function () { var connection = $.connection('/echo'); connection.received(function (data) { $('#messages').append('<li>' + data + '</li>'); var series = chart.series[0]; var series1 = chart.series[1]; var series2 = chart.series[2]; var x = (new Date()).getTime(), // current time y = Math.random(); series.addPoint([x, y], true, true); }); connection.start().done(function () { $("#broadcast").click(function () { connection.send($('#msg').val()); }); }); var chart; $(document).ready(function () { chart = new Highcharts.Chart({ chart: { renderTo: 'container', type: 'spline', marginRight: 130, marginBottom: 25, animation: Highcharts.svg, // don't animate in old IE events: { load: function () { // set up the updating of the chart each second setInterval(function () { z = Math.random() + 3; $('#messages').fadeToggle('1', function () { series1.addPoint([x, z], true, true); }); d = Math.random() + 10; $('#messages').fadeToggle('1', function () { series2.addPoint([x, d], true, true); }); }, 3100); } } }, title: { text: 'Monthly Average Temperature', x: -20 //center }, subtitle: { text: 'Source: WorldClimate.com', x: -20 }, xAxis: { type: 'datetime', tickPixelInterval: 150 }, yAxis: { title: { text: 'Temperature (°C)' }, plotLines: [{ value: 0, width: 1, color: '#808080' }] }, tooltip: { formatter: function () { return '<b>' + this.series.name + '</b><br/>' + Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' + Highcharts.numberFormat(this.y, 2); } }, legend: { layout: 'vertical', align: 'right', verticalAlign: 'top', x: -10, y: 100, borderWidth: 0 }, series: [{ name: 'Tokyo', data: (function () { // generate an array of random data var data = [], time = (new Date()).getTime(), i; for (i = -19; i <= 0; i++) { data.push({ x: time + i * 1000, y: Math.random() }); } return data; })() }, { name: 'BeiJing', data: (function () { // generate an array of random data var data = [], time = (new Date()).getTime(), i; for (i = -19; i <= 0; i++) { data.push({ x: time + i * 1000, y: Math.random() }); } return data; })() }, { name: 'JiNan', data: (function () { // generate an array of random data var data = [], time = (new Date()).getTime(), i; for (i = -19; i <= 0; i++) { data.push({ x: time + i * 1000, y: Math.random() }); } return data; })() } ] }); }); }); </script> </head> <body> <script src="http://code.highcharts.com/highcharts.js"></script> <script src="http://code.highcharts.com/modules/exporting.js"></script> <input type="text" id="msg" /> <input type="button" id="broadcast" value="broadcast" /> <ul id="messages"> </ul> <div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div> </body>服务器代码:
public class DJ_Connection : PersistentConnection { protected override Task OnReceived(IRequest request, string connectionId, string data) { return Connection.Broadcast(data); } }这个很简单,具体的signalr的使用很多啦。大家可以去网上搜索下。或者看官方的demo。在github上。使用起来比想象中还要很简单。。。
ok。再来看,console程序,模拟新数据插入响应给服务器:
using Microsoft.AspNet.SignalR.Client; namespace Console2Web_SignalR { class Program { static void Main(string[] args) { // Connect to the service var connection = new Connection("http://localhost:10010/echo"); // Print the message when it comes in connection.Received += data => Console.WriteLine(data); // Start the connection connection.Start().Wait(); string line = null; while ((line = Console.ReadLine()) != null) { // Send a message to the server connection.Send(line).Wait(); } } } }这段代码完全照搬官方了,很简单。
好啦,今天就这些啦。
之后会去完成真实应用相关代码。再跟大家分享。