`
coach
  • 浏览: 387007 次
  • 性别: 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;
        }
    } 

}





分享到:
评论

相关推荐

    Java 实现 Comet 长连接,服务器主动发送消息给客户端

    Java 实现 Comet 长连接,服务器主动发送消息给客户端是一项关键的技术,它在实时通信、推送服务等领域有着广泛的应用。Comet 是一种基于 HTTP 的持久化连接技术,允许服务器在客户端保持一个打开的 HTTP 连接,直到...

    Comet:基于 HTTP 长连接的“服务器推”技术 (实例)

    Comet 是一种用于 Web 应用程序的异步通信技术,它通过 HTTP 长连接实现服务器向客户端推送数据,而不是传统的由客户端发起请求获取数据。这种技术解决了传统Web应用中实时性不足的问题,使得Web应用能够实现类似...

    Comet:基于_HTTP_长连接的“服务器推”技术

    Comet是一种基于HTTP长连接的“服务器推”技术,它被设计用来解决Web应用程序中实时数据传输的问题。传统的HTTP协议采用请求-响应模型,客户端发起请求,服务器返回响应,这在许多实时性要求高的场景下(如监控系统...

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

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

    【ASP.NET编程知识】页面间隔半秒钟更新时间 Asp.net使用Comet开发http长连接示例分享.docx

    在这个示例中,Comet技术通过持续的HTTP连接实现了页面定时更新,服务器可以在连接保持期间随时向客户端推送新的时间信息,而无需客户端频繁发起请求。这种方式在实时性要求较高,但又不需要WebSocket全双工通信的...

    Comet:基于HTTP长连接的“服务器推”技术[收集].pdf

    长轮询是Comet的一种实现方式,利用AJAX技术,客户端向服务器发送请求并保持连接打开状态。服务器在接收到请求后,不会立即响应,而是等待有新的数据可用时才返回响应,关闭连接,客户端在接收到数据后再次发起新的...

    页面间隔半秒钟更新时间 Asp.net使用Comet开发http长连接示例分享

    页面间隔半秒钟更新时间***使用Comet开发http长连接示例分享,详细地介绍了如何使用Comet技术在***环境下,通过HTTP长连接实现页面定时更新的功能。 知识点一:Comet技术概述 Comet是一种Web应用模型,允许服务器端...

    asp.net comet例子

    服务端页面处理与客户端的长连接,而客户端页面通过Ajax请求建立并维护这个连接。 描述中提到,这个例子基于Ajax的长连接技术,这意味着它使用Ajax来创建一个持久的HTTP连接,而不是传统的请求-响应模式。Ajax允许...

    comet demo 向客户端推送例子

    Comet技术是一种基于HTTP长连接的反向Ajax技术,它允许服务器向客户端浏览器主动推送数据,从而实现双向通信。在Web应用中,通常的HTTP请求是客户端发起的,而Comet打破了这种模式,使得服务器可以在适当的时候主动...

    Ajax和Comet技术总结

    长轮询是Comet的一种常见实现,服务器在接收到请求后不会立即返回,而是保持连接直到有新数据可用,然后发送数据并关闭连接。这种方式有效地减少了不必要的HTTP请求,提高了实时性。 总结起来,Ajax技术利用...

    comet-ajax.rar

    Comet技术和Ajax技术都是Web应用程序中实现实时交互的重要手段,它们改变了传统的HTTP请求-响应模式,提升了Web应用的用户体验。在这篇文章中,我们将深入探讨这两种技术,以及如何结合PHP进行实际开发。 **Comet...

    Extjs 聊天窗口 -续2 - http长连接的实现

    标题中的“Extjs 聊天窗口 -续2 - http长连接的实现”指的是一个关于使用Extjs构建聊天窗口,并且实现HTTP长连接的技术分享。Extjs是一个流行的JavaScript框架,常用于开发富客户端应用程序,而HTTP长连接是解决传统...

    tomcat+comet实现终端与服务端同步的小例子

    1. **创建Servlet**:编写一个Servlet,用于处理Comet请求。Servlet需要处理打开、读取和关闭连接的逻辑。 2. **配置Tomcat**:在Tomcat的server.xml中配置Connector,启用Comet支持。 3. **客户端代码**:在浏览器...

    comet的demo

    - 在这个"Comet的demo"中,可能使用了上述的一种或多种技术来实现长连接和数据推送。具体实现方式可以通过分析代码和运行示例来了解。 5. **文件分析**: - "Comet"这个压缩包中的文件可能是服务器端代码(例如用...

    asp.net基于http的长连接项目

    在ASP.NET中实现基于HTTP的长连接,通常涉及到一种名为“Comet”或“Reverse AJAX”的技术。这种技术允许服务器向客户端推送数据,而无需客户端不断地发起新的HTTP请求,从而实现了类似于即时通讯(IM)系统的实时...

    长轮询Prototype+comet源代码

    长轮询(Long Polling)和Comet技术是Web实时通信(Real-Time Web Communication)中的两种重要机制,它们主要用于实现服务器向客户端的即时数据推送,而不再局限于传统的HTTP请求-响应模式。在本文中,我们将深入...

    comet4j 简单例子+文档

    - 客户端连接:在客户端,通过JavaScript或者Ajax发起请求,建立到服务器的长连接。 - 数据推送与接收:服务器端可以主动向特定的连接推送数据,客户端接收到数据后进行相应处理。 4. **文档**: 提供的文档应该...

    comet4j 所需js以及comet4j-tomcat6.jar、comet4j-tomcat7.jar包

    Comet4j的设计理念是降低实时通信的复杂性,提供简单易用的API,使得开发者无需深入理解底层的HTTP长连接机制,就能实现高效的双向通信。它支持多种推送模式,包括轮询、HTTP Streaming和HTTP Chunked,以适应不同的...

Global site tag (gtag.js) - Google Analytics