comet实现服务器推送技术出现了一些问题

问题描述

comet实现服务器推送技术出现了一些问题

如题
自己写的基于comet服务器推送信息的网站,自己调试的时候没有问题,数据能够更改。
但是 发布到IIS上, 用别的电脑访问的时候,数据不能更改,感觉没有运行代码。
这两台电脑的 防火墙都是关闭的~
js

 $(function () {
     a();
 }
 function a(){
     $.ajax({
        url: "../../NetAnomaly.ashx?"+Math.random(),
        type: "post",
        data: { "type": "connection" },
        success: function (data) {
            if (data=="1") {
                a();
            }
           a();
        },
        error: function () {
            a();
        }
    })
 }

cs

  public class NetAnomaly1 : IHttpAsyncHandler
    {
        public static string name = HttpContext.Current.User.Identity.Name;
        public void ProcessRequest(HttpContext context)
        {

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            //web server 调用BeginProcessRequest 开始异步处理http请求
            IAsyncResult ar = new NetAsyncResult(context, cb, extraData);
            if (context.Request["type"].Equals("connection"))
            {
                chatManager.Start_Long_Connection(ar, name);
            }
            return ar;
        }

        public void EndProcessRequest(IAsyncResult result)
        {
            //web server 调用EndProcessRequest结束 异步处理http请求 一次http连接结束
        }
    }
    /// <summary>
    /// 唯一标示一个异步请求http请求
    /// </summary>
    class NetAsyncResult : IAsyncResult
    {
        HttpContext _context;       //与当前http请求相关的context
        AsyncCallback _cb;          //异步处理的回调方法
        object _extraData;          // 开启异步处理时  传进来的附加参数
        bool _isCompleted;          //异步过程是否完成

        public NetAsyncResult(HttpContext context, AsyncCallback cb, object extraData)
        {
            _context = context;
            _cb = cb;
            _extraData = extraData;
        }

        //向客户端发送 数据
        public void SendMsg(string msg)
        {
            try
            {
                _context.Response.ContentType = "text/html";
                _context.Response.Write(msg);
                try
                {
                    if (_cb != null)
                    {
                        //这步非常关键  该操作告诉web server 结束本次http链接(即server-borwser的 一次http连接结束)
                        _cb(this);
                    }
                }
                catch (Exception ex)
                {
                   throw ex.message;
                }

            }
            finally
            {
                _isCompleted = true;
            }
        }

        public object AsyncState
        {
            get { return null; }
        }

        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get { return null; }
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }

        public bool IsCompleted
        {
            get { return _isCompleted; }
        }
    }

    class chatClient
    {
        static IAsyncResult _netAsyncResult;
        static object _syncObj = new object();
        static DateTime _last_connect_time = DateTime.Now;
        public chatClient(IAsyncResult ar)
        {
            _netAsyncResult = ar;
            _last_connect_time = DateTime.Now;
        }
        public static bool CheckState()
        {
            if (DateTime.Now.AddSeconds(-30) > _last_connect_time)
            {
                //30秒没有新的长连接建立 则认为 客户端断开
                return false;
            }

            if (DateTime.Now.AddSeconds(-15) > _last_connect_time)
            {
                //每15秒发送一次心跳包 强制browser重新建立连接
                lock (_syncObj)
                {
                    (_netAsyncResult as NetAsyncResult).SendMsg("1");
                }
            }
            return true;
        }

        public void UpdateAsyncResult(IAsyncResult ar) //重新建立http长连接
        {
            lock (_syncObj)
            {
                _netAsyncResult = ar;
                _last_connect_time = DateTime.Now;
                (_netAsyncResult as NetAsyncResult).SendMsg("1");
            }
        }
    }

    class chatManager
    {
        static object _syncObj = new object();
        static string name = string.Empty;
        static chatManager()
        {
            StartCheckState();
        }

        /// <summary>
        ///  监测在线用户的连接状态
        /// </summary>
        private static void StartCheckState()
        {
            BackgroundWorker b = new BackgroundWorker();
            b.DoWork += new DoWorkEventHandler(b_DoWork);
            b.RunWorkerAsync();//开始执行后台操作
        }

        static void b_DoWork(object sender, DoWorkEventArgs e)
        {

            while (true)
            {
                lock (_syncObj)
                {
                    try
                    {
                        //判断当前长链接是否建立
                        if (!chatClient.CheckState())
                        {
                            //具体的操作
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        throw  ex;
                    }

                }
                Thread.Sleep(1000);
            }
        }
        /// <summary>
        /// browser端 开始建立一个http长连接
        /// </summary>
        /// <param name="ar"></param>
        public static void Start_Long_Connection(IAsyncResult ar, string uname)
        {
            lock (_syncObj)
            {
                name = uname;
                chatClient client = new chatClient(ar);
                client.UpdateAsyncResult(ar);
            }
        }
    }

这代码是我按照一个例子更改的
链接地址:http://www.cnblogs.com/xiaozhi_5638/p/3722017.html

解决方案

3GoEasy也可以实现这个功能,自己感觉GoEasy要比comet简单易懂些,GoEasy推送专注做web实时推送,服务稳定,中英文文档齐全,是个很不错的选择!官网:https://goeasy.io

时间: 2024-08-03 16:01:04

comet实现服务器推送技术出现了一些问题的相关文章

HTML5服务器推送技术的相应实现细节

对于某些类型的应用来说,服务器推送事件是最佳的选择.本文对服务器推送技术进行了详细的介绍,包含浏览器端和服务器端的相应实现细节,为在实践中使用该技术提供了指南. 对于一般的 Web 应用开发,大多数开发人员并不陌生.在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式.浏览器发出请求,服务器根据收到的请求来生成相应的响应.浏览器再对收到的响应进行处理,展现给用户.响应的格式可能是 HTML.XML 或 JSON 等.随着 REST 架构风格和 AJAX 的流行,服务器更多地使用

深入了解 Dojo 的服务器推送技术

服务器推送技术和 Bayeux 协议简介 服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息.服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接.当服务器需要再次发送一批数据时,浏览器显示数据并保持连接.以后,服务器仍然可以发送批量数据,浏览器继续显示数据,依次类推.基于这种思想,这里我们要引出 Bayeux 协议. Bayeux 是一套基于 Publish / Subscribe 模式,以 JSON 格式在浏览器与服务器之间传输事件的通信协议.该协议规定了浏览器与

java web项目中应用的服务器推送技术都有哪些?有没有性能问题

问题描述 java web项目中应用的服务器推送技术都有哪些?有没有性能问题 java web项目中应用的服务器推送技术都有哪些?有没有性能问题 解决方案 Web实时推送,选择GoEasy推送服务, 代码简单易懂,几分钟就可以自己写好一个在线聊天demo. 中英文文档齐全.官网:https://goeasy.io 解决方案二: 目前,websocket是个很好的方向. 解决方案三: websocket. http://blog.csdn.net/jiangcs520/article/detail

基于comet服务器推送技术(web实时聊天)

原文 http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据. 主要思想:服务器端将数据推送到客户端(浏览器) 本人做了简单的web实时聊天系统:服务器推送(聊天).zip 系统简单说明如下: { 系统所用数据库:sqlite数据库 UserInfo:用户信息表 UserRelation:用户关系表

Android 服务器推送技术

  在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究. 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能. Android Cloud to Device M

JAVA Web实时消息后台服务器推送技术---GoEasy_javascript技巧

越来越多的项目需要用到实时消息的推送与接收,我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari等等. 支持不同的开发语言:GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过Restful API来实现后台实时推送.

详解Comet服务器推送与SignalR

HTTP协议是一个典型的Request/Response协议,是基于TCP/IP之上的一个应用层协议,该协议最典型的特点就是无状态且需要客户端发起Request服务端才能进行Response,这意味着服务端无法主动"推送"信息.但现代很多应用需求这种"服务端推送",比如说监控系统.报价系统.游戏.协同文档.进度条等应用.因此本文会谈论服务器推送技术的不同手段,以及在Asp.Net中的SignalR是如何封装这些细节来达到推送的目的. 实现服务器推送的一些手段 由于H

使用HTTP/2服务端推送技术加速Node.js应用

四月份,我们宣布了对 HTTP/2 服务端推送技术的支持,我们是通过 HTTP 的 Link 头部来实现这项支持的.我的同事 John 曾经通过一个例子演示了在 PHP 里支持服务端推送功能是多么的简单. 我们想让现今使用 Node.js 构建的网站能够更加轻松的获得性能提升.为此,我们开发了 netjet 中间件,它可以解析应用生成的 HTML 并自动添加 Link 头部.当在一个示例的 Express 应用中使用这个中间件时,我们可以看到应用程序的输出多了如下 HTTP 头: 本博客是使用

使用 HTTP/2 服务端推送技术加速 Node.js 应用

netjet 使用了带有定制插件的 PostHTML 来解析 HTML.目前,netjet 用它来查找图片.脚本和外部 CSS 样式表.你也可以用其它的技术来实现这个. 在响应过程中增加 HTML 解析器有个明显的缺点:这将增加页面加载的延时(到加载第一个字节所花的时间).大多数情况下,所新增的延时被应用里的其他耗时掩盖掉了,比如数据库访问.为了解决这个问题,netjet 包含了一个可调节的 LRU 缓存,该缓存以 HTTP 的 ETag 头部作为索引,这使得 netjet 可以非常快的为已经解