首页 | 联系我们 | 叶凡网络官方QQ群:323842844
游客,欢迎您! 请登录 免费注册 忘记密码
您所在的位置:首页 > 新闻中心 > 行业新闻 > 正文

AJAX长轮询之DotNet实现

作者:cocomyyz 来源: 日期:2013-09-30 10:15:08 人气:1 加入收藏 评论:0 标签:

长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

优点:在无消息的情况下不会频繁的请求。

缺点:服务器hold连接会消耗资源。

以上 “长轮询” 定义是我在网上抄的哦!

那么是不是只要满足以上所诉的内容长轮询是不是就成立呢?那就尝试一下!

建立数据库:

  1. if not exists(select 1 from  sys.databases where name='beidoudemo')  

  2. begin  

  3. Create Database beidoudemo  

  4. end  

  5. go  

  6. use beidoudemo  

  7. go  

  8. if exists(select 1 from sysobjects where name='AjaxPolling' and type='u')  

  9. begin  

  10.  drop table AjaxPolling  

  11. end  

  12. go  

  13. Create table AjaxPolling  

  14. (  

  15.  id int identity Primary key,  

  16.  userName varchar(30) not null,  

  17.  passwordKey varchar(50) not null

  18. )

选用Jquery中的AJAX方法发送异步请求,前台省了很多事情了!

具体代码请看:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LongPolling.aspx.cs" Inherits="AjaxFinder.LongPolling" %>  

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  

  3. <html xmlns="http://www.w3.org/1999/xhtml">  

  4. <head runat="server">  

  5.    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>  

  6.    <title></title>  

  7.    <script type="text/javascript">  

  8.        var userID = 0;  

  9.        function SendXHR() {  

  10.            $.ajax({  

  11.                type: "post", //AJAX请求类型

  12.                url: "LongPollingServer.ashx", //请求url

  13.                cache: false,  //无缓存

  14.                timeout: 1000 * 80,  //AJAX请求超时时间为60秒

  15.                data: { time: 60, userID: userID }, //参数time时间为最多等待(后台保持)时间(60秒无论是否有数据立即返回),单位为秒。userID判断诗句是否为新数据的标识

  16.                success: function (data, textStatus) {  

  17.                    var obj = document.getElementById("NameDisplay");  

  18.                    //判断返回成功还是失败  如果后台保持连接的时间一到并且没有新数据就会返回fail开头失败的数据

  19.                    if (data != null && data != "" && !(data.indexOf("fail") != -1)) {  

  20.                        var strarr = data.split(",");  

  21.                       // alert(strarr[0]);

  22.                        userID = strarr[0];  

  23.                        obj.innerHTML = "亲!有新用户注册哦!用户名:" + strarr[1];  

  24.                    }  

  25.                    else {  

  26.                        obj.innerHTML = "亲!暂无新用户注册哦";  

  27.                    }  

  28.                    SendXHR();//请求后立即发起AJAX请求

  29.                },  

  30.                error: function (XMLHttpRequest, textStatus, errorThrown) {  

  31.                    //New Error do something

  32.                    if (textStatus == "timeout") {  

  33.                        //超时间

  34.                        SendXHR();  

  35.                    }  

  36.                }  

  37.            });  

  38.        }  

  39.        window.onload = function () {  

  40.            SendXHR();  

  41.        }  

  42.    </script>  

  43. </head>  

  44. <body>  

  45.    <form id="form1" runat="server">  

  46.    <div>  

  47.    </div>  

  48.        <div id="NameDisplay">  

  49.        </div>  

  50.    </form>  

  51. </body>  

  52. </html>

前台数据请求已经准备好了,接下来看一下后台代码实现。具体代码如下:

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Linq;  

  4. using System.Web;  

  5. using System.Text;  

  6. using System.Net;  

  7. using System.Threading;  

  8. using System.Data;  

  9. namespace AjaxFinder  

  10. {  

  11.    /// <summary>

  12.    /// AJAX长轮询后台处理页面

  13.    /// 主要用于保持连接

  14.    /// 有数据返回,无数据继续保持连接超时返回

  15.    /// author:bluescreen

  16.    /// Date  :2013-03-14

  17.    /// blog:http://www.cnblogs.com/bluescreen/

  18.    /// 请不要关注代码编写规范等一些问题。这仅仅是一个DEMO

  19.    /// 还存在诸多问题

  20.    /// </summary>

  21.    public class LongPollingServer : IHttpHandler  

  22.    {  

  23.        public void ProcessRequest(HttpContext context)  

  24.        {  

  25.           /*

  26.            context.Response.ContentType = "text/plain";

  27.            context.Response.Write("Hello World");*/

  28.            int SendTime = 0;  //最多等待时间

  29.            int userID = 0;    //上一次的用户ID

  30.            if (context.Request.Form["time"] != null&&context.Request.Form["time"].ToString()!="")  

  31.            {  

  32.                SendTime =int.Parse(context.Request.Form["time"].ToString());//接收传来的的后台要保持时间

  33.            }  

  34.            if (context.Request.Form["userID"] != null && context.Request.Form["userID"].ToString() != "")  

  35.            {  

  36.                userID = int.Parse(context.Request.Form["userID"].ToString());  

  37.            }  

  38.            int i = 0;//计算超时时间(秒)

  39.            while (true)  

  40.            {  

  41.                Thread.Sleep(1000);//停留一千毫秒(1秒)

  42.                i++;  

  43.                if (i < SendTime)  

  44.                {  

  45.                    if (NameStr(userID) != "")  

  46.                    {  

  47.                        context.Response.Write(NameStr(userID));  

  48.                        break;  

  49.                    }  

  50.                }  

  51.                if (i == SendTime)  

  52.                {  

  53.                    context.Response.Write("fail:无数据");  

  54.                    break;  

  55.                }  

  56.            }  

  57.        }  

  58.        /// <summary>

  59.        /// 获得用户名

  60.        /// </summary>

  61.        /// <param name="userID"></param>

  62.        /// <returns></returns>

  63.        private string NameStr(int userID)  

  64.        {  

  65.            string result = string.Empty;  

  66.            string Sqlstr = "select top 1 ID,UserName from AjaxPolling   Order by ID desc";  

  67.            DataSet ds = new DataSet();  

  68.            ds = SQLHelper.Query(Sqlstr, null);  

  69.            if (ds != null)  

  70.            {  

  71.                if (ds.Tables[0].Rows.Count >= 1)  

  72.                {  

  73.                    if (int.Parse(ds.Tables[0].Rows[0][0].ToString()) != userID || 0 ==int.Parse(ds.Tables[0].Rows[0][0].ToString()))  

  74.                    {  

  75.                        result = ds.Tables[0].Rows[0][0].ToString() + "," + ds.Tables[0].Rows[0][1].ToString();  

  76.                    }  

  77.                }  

  78.            }  

  79.            return result;  

  80.        }  

  81.        public bool IsReusable  

  82.        {  

  83.            get

  84.            {  

  85.                return false;  

  86.            }  

  87.        }  

  88.    }  

  89. }

本文网址:http://www.mingyangnet.com/html/hangye/263.html
读完这篇文章后,您心情如何?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
更多>>网友评论
发表评论
编辑推荐
  • 没有资料