日期:2014-05-18  浏览次数:20493 次

b/s模式下的服务器推送技术是否真的不可能存在?
现在有一个需求:
当网站某一会员登录时,向他的所有好友发送一个消息(窗口右下角弹出,类似QQ那样)提示该会员已经上线。

google一下,很多人都在在bs下无法实现推送技术,不管是.net还是java,除非自己写个ActiveX插件。

目前我所能做到的就是用ajax定时去获取是否在线的状态。
像百合网就有这功能,当某一人上线后系统会提醒你某人已上线。

------解决方案--------------------
不仅仅其它的AxtiveX,比较流行的Flash或者Flash也可以很好地支持tcp通信,甚至直接继承了音视频基本的采集编码播放等处理功能,这不比自己随便写一个ActiveX插件那么难以部署。

回到普通的网页,你需要基于http进行长连接的话,你的服务器端系统就要自己单独设计开发(并且你要计算好了你到底需要多少服务器才能支持长期运营),这毕竟不是普通的网页服务。
------解决方案--------------------
方法1,ajax,每隔几秒去查一下数据库
方法2,上面说的长连接,百合用的是jsp,jsp中有DWR长连接框架,不过.net暂时还没有发现有什么长连接框架,高手指点一下呢?


还想弱弱的问一下,所谓的服务器“推”技术是建立在长连接框架上的吗?两者有什么关系木有?
------解决方案--------------------
DWR 长连接方式的若干问题
http://hck.iteye.com/blog/845816



------解决方案--------------------
关键点在于,http是短连接,比如这张网页,我向服务器请求了,返回了,OK,这次会话就结束了,如果你轮询,那也是短连接啊,只是不停地请求返回而已
------解决方案--------------------
我理解的长连接应该像tcp协议那样,比如我在线看电影,OK,三次握手后建立连接,直到我电影看完关闭,难道长连接不是这样吗?
------解决方案--------------------
但是楼主说的百合网,或许用户根本没有请求啊,也不会开个端口来listening,那服务端是如何知道该推给哪个机子的呢?
------解决方案--------------------
探讨
但是楼主说的百合网,或许用户根本没有请求啊,也不会开个端口来listening,那服务端是如何知道该推给哪个机子的呢?

------解决方案--------------------
探讨

其实“jsp中有DWR长连接框架”这个说法足以让人昏倒,但是如果放到.net社区中去谈论java,跟在java社区中去谈论.net一样,都会显得比较玄。

这类编程不外乎是客户端程序、服务器程序,http(或者tcp协议),如果你做了一个前端程序,那么你可以访问所有提供此协议的服务器,不管它是什么语言代码而编译成的;如果你做了一个服务程序,可以服务于所有兼容于此协议的前端程序,不管它是什么语……

------解决方案--------------------
Application不是存储着在线列表嘛,,,你登录后,向在线列表中的好友ID发送一个信息

每个人页面有一个定时器 ,定时读取是否有发给自己的未读信息,,


这就是一个很简单的小范围应用
------解决方案--------------------
都是用的Flash,
长链接就是个垃圾。
------解决方案--------------------
用XMLHttpRequest 去实现(火狐可以)。

在服务器端写个死循环发送数据到客户端。
如代码:
C# code

while(true)
{
Response.Write("22222222");
Response.Flush();
Thread.Sleep(1000);
}

------解决方案--------------------
等HTML5吧
------解决方案--------------------
探讨
服务器端就应该是一个比较轻量、比较专业的通讯服务器。你可以使用从.net2.0就已经支持的httplistner自己开发一个web服务器,而不是使用asp.net这类庞然大物。你没有这个技术准备,是不行的。

另外很显然的,通信方式不再是“一问一答”的形式。客户端有很多的请求,都可以通过这个长连接传给服务器;服务器是异步执行各种请求的,然后以任意次序将多个客户端请求的返回值返回给客户端,所以你……

------解决方案--------------------
探讨

用XMLHttpRequest 去实现(火狐可以)。

在服务器端写个死循环发送数据到客户端。
如代码:
C# code

while(true)
{
Response.Write("22222222");
Response.Flush();
Thread.Sleep(1000);
}


在客户端用xmlhttp.readyState==3 时获取数据
如代码:
JScript……

------解决方案--------------------
参考这个有源码
http://www.cnblogs.com/luhaiyan/archive/2011/04/22/2046615.html
------解决方案--------------------
如果是JAVA,那么servlet3.0开始支持彗星技术,也就是HTTP长连接技术。

当然,在ASP.NET中也应该是有对应的方案。

此外,如果不考虑IE6.7.8.9的话,html5 websocket是个不错的选择。
------解决方案--------------------