利用Response.Flush和iframe实现”服务器推”技术
通过在HTML页面里陷入一个隐藏的iframe然后将这个iframe的src属性设为对一个长连接的请求利用chunked传输response 服务器端就能源源不断地往客户推送数据。
基于流方式的”服务器推”模型
服务端在接到客户端的请求时通过Response的Flush()方法发送数据可以使用定时器的方式发送数据没有数据也发送”无数据” ,让客户端保持长连接直至客户端断开连接请求结束。每次数据传送不会关闭连接连接只会在通信出现错误时或是连接重建时关闭一些防火墙常被设置为丢弃过长的连接 服务器端可以设置一个超时时间 超时后通知客户端重新建立连接并关闭原来的连接 。
实现代码
页面Default.aspx用来展示数据
1: 数据列表 o<br />
2: <div id="con" style=" width:400; height:200px; border: 1pxsolid #FF0">
3: </div>
4: <iframe id="flush" src="Flush.aspx" style=" display:none" />
5:ifame的src对应的Flash.aspx后台代码模拟后台发送数据
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: string startHTML = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTDXHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" +Environment.NewLine
4: + "<html xmlns=\"http://www.w3.org/1999/xhtml\" >" +Environment.NewLine
5: + "<head>" + Environment.NewLine
6: + "</head>" + Environment.NewLine
7: + "<body>" + Environment.NewLine;
8:
9: startHTML += new String(' ' , 1024) + Environment.NewLine;
10:
11: Response.Write(startHTML) ;
12: Response.Flush() ;
13:
14: string data = "<scripttype=\"text/javascript\">parent. $('#con' ) .append(\"{0}\") ;</script>";
15: Response.Write(string.Format(data, "开始发送数据<br/>") ) ;
16: Response.Flush() ;
17:
18: int index = 0;
19: while (true)
20: {
21: System.Threading.Thread.Sleep(2000) ;
22: if (index % 2 == 0)
23: {
24: Response.Write(string.Format(data,
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "服务端发送数据<br/>") ) ;
25: }
26: else
27: {
28: Response.Write(string.Format(data,
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "无数据发送<br/>") ) ;
29: }
30: Response.Flush() ;
31:
32: index++;
33: }
34: }
35:
运行Default.aspx的结果
使用iframe请求一个长连接有一个很明显的不足之处 IE、 MorzillaFirefox下端的进度栏都会显示加载没有完成而且IE上方的图标会不停的转动表示加载正在进行刷新当前页面反应也是会很慢。
解决IE的进度栏显示加载没有完成可以使用一个称为“htmlfile”的ActiveX是Google的天才们使用的方法该控件也被用到gmail+gtalk产品中。
修改Default.aspx的页面代码
1: 数y据Y列D表í o<br />
2: <div id="con" style=" width:400; height:200px; border: 1pxsolid #FF0">
3: </div>
4: <script type="text/javascript">
5: function getData(d)
6: {
7: $("#con") .append(d) ;
8: }
9:
10: function rpc_iframe() {
11: var transferDoc = new ActiveXObject("htmlfile") ;
12: transferDoc.open() ;
13: transferDoc.write("<html>")
14: transferDoc.write("<div><iframesrc=\"Flush.aspx\"></iframe></div>") ;
15: transferDoc.close("</html>") ;
16: transferDoc.parentWindow.getData = getData;
17: setInterval (function () { } , 10000) ; //不加这句会使连接断开
18: }
19:
20: rpc_iframe() ;
21: </script>
22:
修改Flush.aspx.cs代码
1: //string data = "<scripttype=\"text/javascript\">parent. $('#con' ) .append(\"{0}\") ;</script>";
2: string data = "<scripttype=\"text/javascript\">parent.getData(\"{0}\") ;</script>";
3:
Tag标签: Comet,服务器推,Response.Flush, iframe,htmlfile
puaex怎么样?puaex是一家去年成立的国人商家,本站也分享过几次,他家主要销售香港商宽的套餐,给的全部为G口带宽,而且是不限流量的,目前有WTT和HKBN两种线路的方面,虽然商家的价格比较贵,但是每次补一些货,就会被抢空,之前一直都是断货的状态,目前商家进行了补货,有需要这种类型机器的朋友可以入手。点击进入:puaex商家官方网站Puaex香港vds套餐:全部为KVM虚拟架构,G口的带宽,可...
Vultr 商家有新增韩国首尔机房,这个是继日本、新加坡之后的第三个亚洲机房。不过可以大概率知道肯定不是直连中国机房的,因为早期的日本机房有过直连后来取消的。今天准备体验看看VULTR VPS主机商的韩国首尔机房的云服务器的速度和性能。1、全球节点PING速度测试这里先通过PING测试工具看看全球几十个节点的PING速度。看到好像移动速度还不错。2、路由去程测试测试看看VULTR韩国首尔机房的节点...
速云怎么样?速云是一家国人商家。速云商家主要提供广州移动、深圳移动、广州茂名联通、香港HKT等VDS和独立服务器。目前,速云推出深圳独服优惠活动,机房为深圳移动机房,购买深圳服务器可享受5折优惠,目前独立服务器还支持申请免费试用,需要提交工单开通免费体验试用,次月可享受永久8折优惠,也是需工单申请哦!点击进入:速云官方网站地址活动期限至 2021年7月22日速云云服务器优惠活动:活动1:新购首月可...