新聞中心
今天突發(fā)奇想,想研究一下服務(wù)端內(nèi)容有變化,如何引起客戶(hù)端的改變。

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到呼和浩特網(wǎng)站設(shè)計(jì)與呼和浩特網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋呼和浩特地區(qū)。
一般來(lái)說(shuō)方法有2種,一種就是客戶(hù)端用JS異步定時(shí)輪詢(xún)服務(wù)器端,這種是大部分人采用的方法,但是我在想到底可以不可以實(shí)現(xiàn)服務(wù)器端有改變時(shí)才會(huì)主動(dòng)推送到客戶(hù)端呢?按理來(lái)說(shuō)這種方式對(duì)于B/S是不可能實(shí)現(xiàn)的,因?yàn)锽/S是無(wú)連接的,這種request/response的方式無(wú)法保持狀態(tài)。搜了一下,看到博客園有位朋友寫(xiě)了篇文章是關(guān)于Server Push的,文章點(diǎn)這里看,我自己把它的代碼復(fù)制過(guò)來(lái)看了下效果,完整代碼如下:
前臺(tái):
﹤%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ServerPushDemo.aspx.cs" Inherits="WebDemo.ServerPush.ServerPushDemo" %﹥
﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥
4
﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥
﹤head runat="server"﹥
﹤title﹥無(wú)標(biāo)題頁(yè)﹤/title﹥
﹤script type="text/javascript"﹥
function SetValue(time)
{
document.getElementById("TbTime").value=time;
}
﹤/script﹥
﹤/head﹥
﹤body﹥
﹤form id="form1" runat="server"﹥
﹤div﹥
﹤input type="text" id="TbTime"/﹥
﹤/div﹥
﹤/form﹥
﹤/body﹥
﹤/html﹥
后臺(tái)代碼:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Threading;
namespace WebDemo.ServerPush
{
public partial class ServerPushDemo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
Response.Buffer = true;
bool isOutput = false;
Response.Write("");
Response.Flush();
int lastsecond = 0;
while (Response.IsClientConnected)
{
Thread.Sleep(300);
if (DateTime.Now.Second != lastsecond && !isOutput)
{
lastsecond = DateTime.Now.Second;
Response.Write(" ");
Response.Flush();
isOutput = true;
}
else
{
isOutput = false;
}
}
}
}
}
這種方式的實(shí)現(xiàn)原理其實(shí)就是在OnRender事件里,用循環(huán)掛起連接,因?yàn)榉?wù)器端沒(méi)有response完畢,所以一直和客戶(hù)端保持連接,雖然這種方式能實(shí)現(xiàn)服務(wù)器端向客戶(hù)端的推送,但它的代價(jià)太大,因?yàn)閣eb的優(yōu)勢(shì)就是無(wú)連接。這樣每個(gè)客戶(hù)端都要占用服務(wù)器端的一個(gè)IIS連接,如果用戶(hù)超過(guò)百個(gè),就會(huì)非??植赖摹K赃@種方式我覺(jué)得不可取,相比來(lái)說(shuō),還是用AJAX的方式定時(shí)輪詢(xún)更好。
真正意義上的Server Push好像我找了一些文章在Cgi里可以實(shí)現(xiàn)。但在.NET里的實(shí)現(xiàn)我就不得而知了,知道的高人請(qǐng)指點(diǎn)下,呵呵。
本文名稱(chēng):淺析.NET中的Serverpush技術(shù)
鏈接分享:http://fisionsoft.com.cn/article/cocsogs.html


咨詢(xún)
建站咨詢(xún)
