[分享]基于Comet推送的动态实时曲线图

by_封爱 2013-01-14 04:04:58
加精
查看原帖

有人问的问题 就是BS结构下的实时的曲线,这个用的好像很多,

于是中午吃饭的时间利用以前在网上找的推送的东西 写了一个

比较简单,用的jschart可以修改你自己想要的chart(js的flash都行)


<script language="javascript" type="text/javascript">
$(document).ready(function () {
wait();
function wait()
{
$.post("GetChartData.do", { content: "-1" },
function (data, status)
{
eval(data);
var myChart = new JSChart('graph', 'line');
myChart.setDataArray(myData);
myChart.setTitle('this is a Demo Charts ');
myChart.setTitleColor('#8E8E8E');
myChart.setTitleFontSize(11);
myChart.setAxisNameX('Years');
myChart.setAxisNameY('Values');
myChart.setAxisColor('#C4C4C4');
myChart.setAxisValuesColor('#343434');
myChart.setAxisPaddingLeft(50);
myChart.setAxisPaddingRight(50);
myChart.setAxisPaddingTop(50);
myChart.setAxisPaddingBottom(40);
myChart.setAxisValuesNumberX(6);
myChart.setGraphExtend(true);
myChart.setGridColor('#c2c2c2');
myChart.setLineWidth(6);
myChart.setLineColor('#9F0505');
myChart.setSize(616, 321);
myChart.setBackgroundImage('chart_bg.jpg');
myChart.draw();


wait();
}, "html"
);
}

});

</script>


<div id="graph">Loading graph...</div>


<httpHandlers>
<add path="GetChartData.do" type="AsnyHandler" verb="POST,GET"/>
</httpHandlers>


using System;
using System.Collections.Generic;
using System.Web;
using System.Threading;

/// <summary>
/// Summary description for AsnyHandler
/// </summary>
public class AsnyHandler:IHttpAsyncHandler
{
public AsnyHandler()
{
}

public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
myAsynResult asyncResult = new myAsynResult(context, cb, extraData);
String content = context.Request.Params["content"];

//当前部分就是你自己的拼出来的数组了,当前部分根据你实际的chart控件来拼
content = "var myData =new Array";
content += "(";
Random r = new Random();
for (int i = 2000; i < 2030; i++)
{
int j = r.Next(0, 200);
content += "["+i.ToString()+","+j.ToString()+"],";
}
content = content.Substring(0, content.Length - 1);
content += ")";
//一秒一刷新
System.Threading.Thread.Sleep(1000);

//向Message类中添加该消息
Messages.Instance().AddMessage(content, asyncResult);
return asyncResult;
}

#region 不必理会

public void EndProcessRequest(IAsyncResult result)
{

}

public bool IsReusable
{
get { return false; ; }
}

public void ProcessRequest(HttpContext context)
{
}
#endregion
}
public class myAsynResult : IAsyncResult
{
bool _IsCompleted = false;
private HttpContext context;
private AsyncCallback cb;
private object extraData;
public myAsynResult(HttpContext context, AsyncCallback cb, object extraData)
{
this.context = context;
this.cb = cb;
this.extraData = extraData;
}
private string _content;
public string Content {
get {return _content;}
set{_content=value;}
}

#region IAsyncResult接口
public object AsyncState
{
get { return null; }
}

public System.Threading.WaitHandle AsyncWaitHandle
{
get { return null; }
}

public bool CompletedSynchronously
{
get { return false; }
}
public bool IsCompleted
{
get { return _IsCompleted; }
}
#endregion

//在Message类中的添加消息方法中,调用该方法,将消息输入到客户端,从而实现广播的功能
public void Send(object data)
{
context.Response.Write(this.Content);
if (cb!=null)
{
cb(this);
}
_IsCompleted = true; ;
}
}


using System;
using System.Collections.Generic;
using System.Web;

/// <summary>
/// Summary description for Messages
/// </summary>
public class Messages
{
//记录所有请求的客户端
List<myAsynResult> clients = new List<myAsynResult>();

#region 实现该类的单例
private static readonly Messages _Instance = new Messages();
private Messages()
{
}
public static Messages Instance()
{
return _Instance;
}
#endregion

public void AddMessage(string content,myAsynResult asyncResult)
{
//当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
//此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
if (content=="-1")
{
clients.Add(asyncResult);
}
else
{
//将当前请求的内容输出到客户端
asyncResult.Content = content;
asyncResult.Send(null);

//否则将遍历所有已缓存的client,并将当前内容输出到客户端
foreach (myAsynResult result in clients)
{
result.Content = content;
result.Send(null);
}

//清空所有缓存
clients.Clear();
}
}
}


以上是2个cs

网速太卡了 图片上不去,大家自行下载

突然发现 我已经上传过了, 上面的 就是1分的 我又上传了一个0分的 不知道为啥没显示出来

等我现实之后 在修改连接吧..
(ps:没啥含量高手勿喷啊)
...全文
10383 71 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingpin 2013-09-04
  • 打赏
  • 举报
回复
收藏,学习,备用;
Joson.e8love 2013-02-06
  • 打赏
  • 举报
回复
标识下。。。。。。。。。。。
jhdxhj 2013-02-04
  • 打赏
  • 举报
回复
8cuo~~~~
脱管态的狗 2013-02-04
  • 打赏
  • 举报
回复
54楼提到的 你是client不停的轮训server吗? 这样两边的压力都会变大。你可以考虑利用http1.1的长连接,在双向单通道内通信 就是这个东西在支撑,其实1.0里就有很多浏览器有支持,所以1.1里出现了长连。 即时通讯还需要有个协议,XMPP-BOSH就是你想要的东西,tigase说他们测试过一台服务器就可以支持几十万个长连
脱管态的狗 2013-02-04
  • 打赏
  • 举报
回复
XMPP里面有个BOSH
脱管态的狗 2013-02-04
  • 打赏
  • 举报
回复
XMPP就是你想要的最佳答案,看看吧
jinkunaier 2013-02-01
  • 打赏
  • 举报
回复
Mark,记录下来,以后好用到!!!
wang123qin 2013-01-28
  • 打赏
  • 举报
回复
真一点都不懂,佩服,
gyff520 2013-01-28
  • 打赏
  • 举报
回复
谢谢分享,不错
CrySleeper 2013-01-28
  • 打赏
  • 举报
回复
没看到用comet!!!
阿克巴尔 2013-01-27
  • 打赏
  • 举报
回复
撒啊我咋没看懂
szcan18 2013-01-26
  • 打赏
  • 举报
回复
不错啊嗄。。谢谢分享
改bug神枪手 2013-01-24
  • 打赏
  • 举报
回复
你是client不停的轮训server吗? 这样两边的压力都会变大。你可以考虑利用http1.1的长连接,在双向单通道内通信
showjim 2013-01-23
  • 打赏
  • 举报
回复
引用 37 楼 sp1234 的回复:
在我这里,comet就是“死翘翘”的同义词。虽然网上有很多宣传文章,我还没有看到有能够商用的。(当然,如果你能够拿出100台服务器来服务几百个客户端,也可以尝试comet)
是否需要N多服务器不应该是使用了comet的原因。
showjim 2013-01-23
  • 打赏
  • 举报
回复
引用 37 楼 sp1234 的回复:
你没有说出关键的差别。人家是想做“即使通讯”,也就是说一个用户发消息,那么其它用户立刻就显示出来了,而不是的等待3秒钟,更不能等待一分钟。
这么说过分了一下,网络应用根本就不存在立刻的概念,有一定延时是正常的,关键是是否满足需求。
showjim 2013-01-23
  • 打赏
  • 举报
回复
websocket与长轮询各有优势。 websocket不用断开连接,开销比长轮询少。 长轮询兼容性好,适当的超时设置,相比websocket的开销基本就可以忽略了。 所以长轮询应该是首选方案。
by_封爱 2013-01-23
  • 打赏
  • 举报
回复
引用 47 楼 xyz378704 的回复:
我的理解,说错莫怪, 楼主的例子依旧是AJAX轮询, 服务端虽然用了异步来处理但是疑问就来了 异步处理中的线程从何处来,应该也是从线程池中来,线程池是有限的,多几个连接就挂掉了。不可取。
就是这样的 帮忙看下http://bbs.csdn.net/topics/390353628
曹志士 2013-01-23
  • 打赏
  • 举报
回复
8cuo~~~~
  • 打赏
  • 举报
回复
引用 45 楼 chopper7278 的回复:
comet的处理方式最好弄明白 原理明白 但是在asp.net下的实现高并发的程序就不那么简单了 最近忙项目 有空我打算写几篇这方……
呵呵,好的,写了,我一定看。
xyz378704 2013-01-22
  • 打赏
  • 举报
回复
我的理解,说错莫怪, 楼主的例子依旧是AJAX轮询, 服务端虽然用了异步来处理但是疑问就来了 异步处理中的线程从何处来,应该也是从线程池中来,线程池是有限的,多几个连接就挂掉了。不可取。
加载更多回复(40)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧