首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

b/s模式下的服务器推送技术是否真的不可能存在?该怎么解决

2012-04-11 
b/s模式下的服务器推送技术是否真的不可能存在?现在有一个需求:当网站某一会员登录时,向他的所有好友发送

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是个不错的选择。
------解决方案--------------------


AspNetComet 可以看看,研究学生下。。
[解决办法]
长连接跟ajax定时查询没有太多的区别。
定时查询只是瞬时的查询,查询完成之后就返回结果,不保证结果一定存在。
长连接相对而言连接的时间跟长一点,基本可能简单的理解为有查询结果就返回,如果没有查询结果,就不返回,继续在服务器端等待,直到有查询结果产生。

我理解的长连接模式:
在JSP采用死循环发生ajax请求,请求进入后台之后,查询结果,如果存在结果,返回ajax请求,否则将请求防止在后台等待结果,直到结果产生或者超时返回到客户端。

为了能够提高查询效率,可以认为的开辟一个缓存用于存放信息,ajax的请求查询基于缓存而不是数据库,从而减少定时与数据数据的交互。

比如我们可以将发送的信息存在在数据库的同时,将其放在缓存当中,并可以同时设定其状态为“未阅读”,ajax请求来之后将缓存中得状态为“未阅读”的数据获取返回到前台,同时在缓存中踢出此信息。
[解决办法]
长连接 

轮询

都可以做 服务器推送没错

最近搞 webIm 获取信息都这样

你说的这个就像 webIm中的广播了

热点排行