`
coach
  • 浏览: 382469 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

comet(http 请求长连接) 之 ajax 长查询 简单实现。

    博客分类:
  • http
阅读更多
这几天看到几篇关于http 长连接的文章,之前做过一个简单WebIM 采用ajax定时查询,效率一般,请求一多 iis 日志每天大概有80M左右。在线人数在40人左右(基本和挂QQ一样)。

今天特意研究了一下http 的长连接。有了一点点成果。现放出来大家一起讨论一下。

不清楚长连接请点这里。

1.客户端请求

<script type="text/javascript"> 

var HttpRequest; 

function CreateXmlHttpRequest()
{
   if(window.XMLHttpRequest)
   {
      HttpRequest=new XMLHttpRequest();
   }
   else if(window.ActiveXObject)
   {
      HttpRequest=new ActiveXObject("MICROST.XMLHTTP");
   }
} 

function Send()
{
    document.getElementById("test").innerHTML="等待返回信息";
    CreateXmlHttpRequest();
    if(HttpRequest!=null)
    {
       HttpRequest.onreadystatechange=ShowMessage;
       HttpRequest.open("GET","Handler.ashx?name="+escape("leon")+"&m"+Math.random());
       HttpRequest.send();
    }
} 

function ShowMessage()
{
    if(HttpRequest.readyState==4&&HttpRequest.status==200)
    {
        if(HttpRequest.responseText.length>0)
        {
           alert(HttpRequest.responseText);//收到信息
           //如果有信息返回 重新发送请求 递归
           Send();
        }
    }
} 

</script>


2.服务的如何hold请求
public class Handler : IHttpHandler
{
    private bool ok = true; 

    public void ProcessRequest(HttpContext context)
    {
        ok = true;
        while (ok)//超时设置ok为false即可
        {
            //循环检查是否有信息存在
            Check(); 

            //防止循环太频繁 
            System.Threading.Thread.Sleep(1000);
        }
    } 

    private void Check()
    {
        List<message> list = new List<message>();//信息列表 

        string str = "";
        lock (im.mlist)
        {
            if (im.mlist.Count > 0)
            {
                foreach (message m in im.mlist)
                {
                    if (m.username == HttpContext.Current.Request["name"].ToString())
                    {
                        list.Add(m);
                        str = m.messagecontent;
                        break;
                    }
                } 

                if (list.Count > 0)
                {
                    foreach (message m in list)
                    {
                        im.mlist.Remove(m);
                    }
                } 

                //收到信息 循环结束
                ok = false; 

                if (list.Count > 0)
                {
                    //推信息
                    HttpContext.Current.Response.Write("收到信息:" + str);
                }
            }
        }
    } 

    public bool IsReusable
    {
        get
        {
            return false;
        }
    } 

}





分享到:
评论

相关推荐

    CometAsync_net:C#实现基于http长连接“服务器推”-Comet技术

    C#实现基于http长连接“服务器推”-Comet技术 很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。 本项目基于 AJAX 的长轮询方式实现。 ...

    ASP.NET实现comet的聊天交互功能

    说明 : 一、概念 借用横刀天笑的解释这个Comet概念:“像彗星那样拖着长长的尾巴的http长连接”。事实上大家都知道,http是不可以与服务器持久连接的,要是每个请求...再次建立等待请求,重复循环,实现“长连接”。

    php开发客服系统(持久连接+轮询+反向ajax) - php严程序

    真正的实时聊天,使用持久连接+轮询+反向ajax实现 用户端(可直接给客户发送消息) 客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式: 一:iframe + 服务器推技术comet(反向ajax,即服务器向浏览器推送数据) ...

    详解Tomcat如何实现Comet

    刚开始人们在客户端通过不断自动刷新整个页面来更新数据,后来觉得体验不好又使用了AJAX不断从客户端轮询服务器更新数据,然后是使用Comet模式由服务器端通过长连接推数据。Comet模式能大大减少发送到服务器端的请求...

    基于comet服务器推技术思路的Pushlet技术实现1

    (2)基于Ajax推送Ajax主要是基于浏览器发送异步请求,提高用户操作的响应性 (1)基于 AJAX 的长轮询方式长轮询:HTTP的连接保持,服务器端会阻塞请

    Node.js实现数据推送

    场景:后端更新数据推送到客户端...2. Comet的概念是长连接,客户端发送请求后,后端将连接保持下来,直到连接超时或后端返回数据时再重新建立连接,有效的将通信资源转移到了服务器上,实际消耗的是服务器资源。 3. W

    JsSocket,JS+FLEX+JAVA模拟的Js Soclet

    3、使用DWR框架的comet长连接模拟实现,缺点大家都心知肚明,最新的HTML5的WebSocket,虽然很好的解决了这一问题,但IE9及以下版本不兼容HTML5,即不能使用WebSocket来达到目的,本组件因使用的 js + flex,几乎可以...

    servlet4 jar

    AJAX 的应用使请求的出现变得频繁,而 Comet 则会长时间占用一个连接,上述的服务器模型在新的应用背景下会变得非常低效,线程池里有限的线程数甚至可能会阻塞新的连接。Jetty 6 Web 服务器针对 AJAX、Comet 应用的...

    使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码

    两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION

    orbited:一个Rails插件,可以更轻松地向您的Rails应用添加Orbited支持

    轨道上轨道 Orbited on Rails是一个插件,可让您的Rails应用程序轻松使用Comet向用户推送更改。 ,也称为反向Ajax和服务器推送(以及其他昵称),是一... Orbited允许浏览器以很少的开销与服务器保持长连接,以便可以

Global site tag (gtag.js) - Google Analytics