大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > ASP.NET技巧 > Asp.Net实现Http长连接推送

Asp.Net实现Http长连接推送(1)

关键词:Asp.NetHttp长连接推送  阅读(1998) 赞(16)

[摘要]本文是对Asp.Net实现Http长连接推送的讲解,对学习ASP.NET编程技术有所帮助,与大家分享。

话说最新帮一个朋友搞智能家居方面的东西,做一个云平台。主要作用手机在局域网外环境时对手机客户端和智能网关中命令的互相转发。

目前已经有了一个稳定的Socket版本,但是考虑到以后的扩展和性能指标要改成Http长连接形式,这确实是一个很逗逼的方案。

下面普及一下Http长连接的概念,所谓的Http长连接其实不是指像Socket那样的建立一个连接client端和server端来回传递数据。Http长连接指的是客户端发送给服务器端的Http请求不会马上得到服务器的应答,而是当满足一定条件时服务器才“主动”将数据返回给客户端,这时一次Http请求才算结束。实际应用中为客户端在结束了一个长连接后往往要再次建立一个长连接,也就是客户端到服务器端总是维持一个打开的下行Http通道。

搞过Socket的同学都知道,Socket通讯中除了有自己的协议以外还要有心跳的命令,以此来保证客户端和服务器端连接的状态。这些本文都不去深究,主要还是说长连接的这个小框架。

代码是我们最好的伙伴,下面我们结合代码说说这个简单的东西。

Asp.Net4.0中加入了很多异步特性,其中IHttpAsyncHandler配合IAsyncResult可以很好的解决本文的需求。首先我们定义一个类实现IAsyncResult这个接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using log4net;

namespace SM.BIZKeepAliveHttp
{
    /// <summary>
    /// 一个异步会话,会话会被临时缓存
    /// </summary>
    public class HKAsyncRequest : IAsyncResult
    {
        private static readonly ILog logger = LogManager.GetLogger(typeof(HKAsyncRequest));

        public HKAsyncRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            this.Context = context;
            this.CallBack = cb;
            this.ExtraData = extraData;
        }

        public HttpContext Context
        {
            get;
            set;
        }

        public object ExtraData
        {
            get;
            set;
        }

        public AsyncCallback CallBack
        {
            get;
            set;
        }

        public bool IsCompleted
        {
            get;
            set;
        }


        public object AsyncState
        {
            get;
            set;
        }

        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get;
            set;
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }

        public void Send(string response) {
            if (String.IsNullOrEmpty(response))
                return;
            try
            {
                this.Context.Response.ContentType = "text/plain";
                this.Context.Response.Write(response);
                if (this.CallBack != null)
                {
                    this.CallBack(this); 
                }
            }
            catch (Exception ex)
            {
                logger.Error("输出到客户端发生错误:" + ex.Message);
            }
            finally 
            {
                IsCompleted = true; 
            }
        }

        public void Send(byte[] b,int offset,int length){
            string str = Func.ByteArrayToHexString(b);
            this.Send(str);
        }

    }
}
«上一页123下一页»


相关评论