现在有一个需求:
当网站某一会员登录时,向他的所有好友发送一个消息(窗口右下角弹出,类似QQ那样)提示该会员已经上线。google一下,很多人都在在bs下无法实现推送技术,不管是.net还是java,除非自己写个ActiveX插件。目前我所能做到的就是用ajax定时去获取是否在线的状态。
像百合网就有这功能,当某一人上线后系统会提醒你某人已上线。

解决方案 »

  1.   

    不仅仅其它的AxtiveX,比较流行的Flash或者Flash也可以很好地支持tcp通信,甚至直接继承了音视频基本的采集编码播放等处理功能,这不比自己随便写一个ActiveX插件那么难以部署。回到普通的网页,你需要基于http进行长连接的话,你的服务器端系统就要自己单独设计开发(并且你要计算好了你到底需要多少服务器才能支持长期运营),这毕竟不是普通的网页服务。
      

  2.   

    如果你拿asp.net写个单机小web软件,那么我劝你还是算了。根本不是这个开发方法。
      

  3.   

    比较流行的Flash或者Flash也可以很好地支持tcp通信  -->  比较流行的Flash或者SL也可以很好地支持tcp通信
    多余很多asp.net开发人员来说,就是用asp.net写一个小应用程序,数据库什么的都是在服务器端单机本地访问。这样你就没有专门的用于通讯的服务器端,就不要考虑做网络软件。这种方式的asp.net做一些网页式的OA,查询一下数据库资料就可以了。要想做实时通讯,即使是支持http长连接,你也应该自己拿出一台服务器机器专门开发一个服务器端系统,用于处理通讯服务,而不是用它来处理http请求的网页下载。
      

  4.   

    只是想当我登录上线时,通知我的好友我已上线,右下角有弹出个窗口(过几秒后自动消失)
    并不想做小软件或webqq
      

  5.   


    不是小软件,就要自己开发一个支持http长连接通讯服务器系统,这跟一般的网站网页处理并没有关系。
      

  6.   

    方法1,ajax,每隔几秒去查一下数据库
    方法2,上面说的长连接,百合用的是jsp,jsp中有DWR长连接框架,不过.net暂时还没有发现有什么长连接框架,高手指点一下呢?
    还想弱弱的问一下,所谓的服务器“推”技术是建立在长连接框架上的吗?两者有什么关系木有?
      

  7.   

    其实“jsp中有DWR长连接框架”这个说法足以让人昏倒,但是如果放到.net社区中去谈论java,跟在java社区中去谈论.net一样,都会显得比较玄。这类编程不外乎是客户端程序、服务器程序,http(或者tcp协议),如果你做了一个前端程序,那么你可以访问所有提供此协议的服务器,不管它是什么语言代码而编译成的;如果你做了一个服务程序,可以服务于所有兼容于此协议的前端程序,不管它是什么语言代码而编译成的。所以首先,编程语言可能是到一个公司上班的招牌,但不是你设计一个系统的根据。所谓http轮询是长连接,在编程上并没有什么特别东西,就好象你在写tcplistener程序时,可以将客户端socket暂时保存起来,然后随时send一些字节给客户端一样,httpcontext也可以保存起来,而不像heetcontext.response返回任何数据。然后当有数据需要写到客户端时,立刻执行httpconetext.response.outputstream.write(...),然后关闭httpcontext.respose.close()。并且约定,客户端在获得一个返回之后,或者获得超时异常之后,需要另外开启一个长连接请求。而服务器端需要在没有数据输出时捕获超时异常,并且抛弃异常,或者是等待一段时间以后向客户端发送一个心跳消息来让客户端开启下一个链接。现实是,很多使用asp.net、windows之类的很低门槛的编程人员,不做实际的通讯程序,也就没有必要去了解太多通讯程序的编程。
      

  8.   

    服务器端就应该是一个比较轻量、比较专业的通讯服务器。你可以使用从.net2.0就已经支持的httplistner自己开发一个web服务器,而不是使用asp.net这类庞然大物。你没有这个技术准备,是不行的。另外很显然的,通信方式不再是“一问一答”的形式。客户端有很多的请求,都可以通过这个长连接传给服务器;服务器是异步执行各种请求的,然后以任意次序将多个客户端请求的返回值返回给客户端,所以你的客户端需要管理每一个请求的回调。另外经常有无需返回值的消息,特别是服务器推送给客户端的即时消息。如果你没有这个技术准备,也是不行的。显然客户端编程方式也要做出改变,你不能使用普通的ajax调用,而应该使用这种方式的ajax调用。
      

  9.   

    DWR 长连接方式的若干问题
    http://hck.iteye.com/blog/845816
      

  10.   

    关键点在于,http是短连接,比如这张网页,我向服务器请求了,返回了,OK,这次会话就结束了,如果你轮询,那也是短连接啊,只是不停地请求返回而已
      

  11.   

    我理解的长连接应该像tcp协议那样,比如我在线看电影,OK,三次握手后建立连接,直到我电影看完关闭,难道长连接不是这样吗?
      

  12.   

    是不是这样,都要根据http协议所处的真实环境进行调整。让我们举个例子吧,假设客户端网页向服务器连续发送了10个消息,服务器端异步处理这10个消息,假设在100毫秒内有5个执行完了,那么将这5个组合到一起返回给客户端,于是这一次http请求就结束了。然后客户端又启动了另外一次请求,这一次直到等待了1100毫秒才有4个请求几乎同时完成,于是又组装在一起返回给客户端,结束了这次请求。然后客户端又会开启新的请求。而客户端,每一次对服务器的请求显然都是并发的,并不是什么等待上一次请求返回消息之后才进行下一次请求。当然更不能开多个线程去执行这类ajax操作。所以http长连接方式下,你的ajax客户端要架构要改变(虽然实现结果是并发异步回调的,但是底层呢个肯定不能使用传统的ajax方式),你要自己开发一个轻量级的web通讯服务器,这都是必不可少的。
      

  13.   

    为什么“google一下,很多人都在在bs下无法实现推送技术”?因为那些网络文章不知是有意还是无意,都似乎面向学生做个概念普及,你一旦用到最低级的压力测试上就无法工作了。
      

  14.   

    但是楼主说的百合网,或许用户根本没有请求啊,也不会开个端口来listening,那服务端是如何知道该推给哪个机子的呢?
      

  15.   

    而客户端,每一次对服务器的请求显然都是并发的  -->  而ajax编程端,每一次对服务器的请求显然都是并发的这里使用“客户端”这个词有点容易乱。你肯定需要开发自己的ajax框架,以及自己的web通讯服务器,然后脚本编程就没有什么难度了。浏览器当然是基于http协议来访问web服务器的,而且保证跟普通的http请求一样。脚本中的多个ajax请求当然你还是组合在一起通过单个http请求访问web服务器,而不是多个http连接去访问服务器。返回消息也是如此。
      

  16.   


    我没有去看“百合网”。http长连接是用在需要比较专业的通讯程序开发上,如果就是简单地ajax轮询一下,何必要长连接?另外,很多网页不需要搞有点“玄”的http通讯方式,它完全可以根据客户端浏览器环境而推出一个基于Flash或者基于Silverlight的插件,用于处理tcp长连接,并且与网页交互。我在一开始也说过了这种解决方式。
      

  17.   

    Application不是存储着在线列表嘛,,,你登录后,向在线列表中的好友ID发送一个信息每个人页面有一个定时器 ,定时读取是否有发给自己的未读信息,,
    这就是一个很简单的小范围应用
      

  18.   

    都是用的Flash,
    长链接就是个垃圾。
      

  19.   

    用XMLHttpRequest 去实现(火狐可以)。在服务器端写个死循环发送数据到客户端。
    如代码:while(true)
    {
    Response.Write("22222222");
    Response.Flush();
    Thread.Sleep(1000);
    }在客户端用xmlhttp.readyState==3 时获取数据
    如代码: if(xmlhttp.readyState==3) 
                {
                    if(xmlhttp.status==200)
                    {
                         alert(xmlhttp.responseText);
    }
    }但是此方式在火狐浏览器上用可以,ie不行,xmlhttp.readyState==3时ie接受不到数据的。
    ie上可以用iframe或new ActiveXObject("htmlfile") 去实现。我感觉长连接的效率也不高啊?
      

  20.   


    你改用jquery.ajax试试,我测试是可以的
    不过也有问题,就是在请求页面不能使用会话对象,否则其它请求会被阻塞
    我感觉长连接的效率也不高啊?

    个人以为虽然不能和tcp/ip通信相比,但比用定时查询要好得多,
    起码避免了频繁的与服务器连接,毕竟这是web程序
      

  21.   

    参考这个有源码
    http://www.cnblogs.com/luhaiyan/archive/2011/04/22/2046615.html
      

  22.   

    如果是JAVA,那么servlet3.0开始支持彗星技术,也就是HTTP长连接技术。当然,在ASP.NET中也应该是有对应的方案。此外,如果不考虑IE6.7.8.9的话,html5 websocket是个不错的选择。
      

  23.   

    AspNetComet  可以看看,研究学生下。。
      

  24.   

    谢谢大家的一直关注,特别是sp1234的热心解答,目前以自己的技术水平还不能做到像你所说的那地步。只能再继续寻找其他我所能接受的了的知识。
    不知楼上几位讨论的长链接跟ajax定时查询有什么区别。
      

  25.   

    长连接跟ajax定时查询没有太多的区别。
    定时查询只是瞬时的查询,查询完成之后就返回结果,不保证结果一定存在。
    长连接相对而言连接的时间跟长一点,基本可能简单的理解为有查询结果就返回,如果没有查询结果,就不返回,继续在服务器端等待,直到有查询结果产生。我理解的长连接模式:
    在JSP采用死循环发生ajax请求,请求进入后台之后,查询结果,如果存在结果,返回ajax请求,否则将请求防止在后台等待结果,直到结果产生或者超时返回到客户端。为了能够提高查询效率,可以认为的开辟一个缓存用于存放信息,ajax的请求查询基于缓存而不是数据库,从而减少定时与数据数据的交互。比如我们可以将发送的信息存在在数据库的同时,将其放在缓存当中,并可以同时设定其状态为“未阅读”,ajax请求来之后将缓存中得状态为“未阅读”的数据获取返回到前台,同时在缓存中踢出此信息。
      

  26.   

    长连接 轮询都可以做 服务器推送没错最近搞 webIm 获取信息都这样你说的这个就像 webIm中的广播了