服务器如何主动向客户端 服务器 模式发送数据

COMET服务器推技术 – 实现Web服务器“主动”向客户端发送数据 – Starlight36's Blog
COMET服务器推技术 – 实现Web服务器“主动”向客户端发送数据
&&&&&&在WEB开发中常常遇到一种需要即时更新内容的情况,比如在线聊天室,基于Web的IM系统或者股票查看系统等等。这些系统无一例外地要求内容更新的及时性。即每次有了新的内容,都必须即时发送给客户端。由于B/S架构的先天特性,即HTTP协议是一种无状态无链接协议,所以要实现服务器端主动发送数据给客户端,传统方法是难以实现的。为了解决这一问题,COMET服务器推技术便应运而生。&&&&&&在传统的解决方案中,对页面进行全部或者局部刷新,似乎是解决这一问题的唯一办法。早期基于Web的聊天室一般都采用这种方法。即在页面中插入一个隐藏的iframe,通过这个iframe不断地自动刷新来轮询服务器端以获得最新消息,亦或是采用AJAX技术,每相隔一段时间发起一次HTTP请求来更新内容。但是这种方法缺点是非常明显的。首先,延迟无法避免,没有办法做到完全的及时性。如果我们设定轮询间隔为5s,那么内容更新的最大延迟就会说5s。其次,为了追求及时性,频繁的刷新、轮询,会造成过大的服务器压力。当在线人数很多时,这种方法几乎就是变相的分布式拒绝服务攻击。&&&&&&那么有没有一种更加划算的方法呢?当然有的,比如使用activeX控件或者JAVA Applet等实现Socket通信。不过这种方法需要另外开端口,在网络情况复杂特别是存在防火墙的情况下,会造成通信失败。另外,使用Socket通信,还对服务器存在一定的要求,需要自己实现一套C/S模式的东西,这不符合Web开发的初衷。&&&&&&在HTTP中有一种长连接技术,可以模仿Socket通信实现服务器端主动向客户端浏览器发送数据。它的原理其实很简单:当服务器端接到客户端的询问请求后,将整个HTTP连接置于阻塞状态,即什么也不做,也不发送数据,也不关掉连接。直到客户端需要将最新数据返回给客户端时,将数据通过这个HTTP连接返回回去,并且关闭连接。这样,客户端看到的结果,就似乎是服务器端主动向客户端浏览器发送数据了。但是,关掉连接以后怎么办呢?这时候,可以通过客户端JS代码中的定时器,再次发起请求。这样,只有内容发生了变化,才会进行一次HTTP会话,所以整体效率比轮询方式要高出很多,同时还有了更好的及时性。&&&& 在人人网中,页面中的即时消息提醒、在线IM就是通过这种方法实现的。另外,在WebQQ等基于WEB的IM中也广泛使用了这种技术。当然,在HTML5中,提供了专用的持久连接套接字,能够实现真正的服务器主动发送数据给客户端。&&&& 那么如何用代码来实现这个COMET服务器推送呢?请看下面。这部分代码是我从网上收集过来的,基于PHP 和prototype库写成。详情参考PHP服务器端代码:[codesyntax lang=&#8221;php&#8221;]<?php$filename&&= dirname(__FILE__).&#8217;/data.txt';$msg = isset($_GET[&#8216;msg&#8217;]) ? $_GET[&#8216;msg&#8217;] : &#8221;;if ($msg != &#8221;)&#123;&&//写入内容至文件&&file_put_contents($filename,$msg);&&die();&#125;set_time_limit(0);$lastmodif&&&&= isset($_GET[&#8216;timestamp&#8217;]) ? $_GET[&#8216;timestamp&#8217;] : 0;//取得文件最后修改时间$currentmodif = filemtime($filename);while ($currentmodif <= $lastmodif) &#123;&&&&//有释放CPU占用率的作用&&&&usleep(10000); &&&&//清除文件缓存信息&&&&clearstatcache();&&&&$currentmodif = filemtime($filename);&#125;// return a json array$response = array();$response[&#8216;msg&#8217;]&&&&&& = file_get_contents($filename);$response[&#8216;timestamp&#8217;] = $echo json_encode($response);ob_flush();flush();?>[/codesyntax]JS客户端代码:[codesyntax lang=&#8221;javascript&#8221;]/***************************************** *&& @Description : Comet TEST *&&@FileName&&&&: comet.js *&& @Author&&&&&&: He Chang Min
*&& @Date&&&&&&&&:
*&& @Comment&&&& :
******************************************/var WebApp = &#123;&&//程序入口函数&&WebMain : function()&&&&&#123;&&&&&&var ajax = new Ajax.Request(WebApp._url_, &&&&&#123;&&&&&&method: &#8216;get&#8217;,&&&&&&parameters: &#123; &#8216;timestamp&#8217; : WebApp._timestamp_ &#125;,&&&&&&&&onSuccess: function(transport) &&&&&&&#123;&&&&&&&&&&&&var response = transport.responseText.evalJSON();&&&&&&&&&&&&WebApp._timestamp_ = response[&#8216;timestamp&#8217;];&&&&&&&&&&&&WebApp.handleResponse(response);&&&&&&&&&&&&WebApp._noerror_ =&&&&&&&&&#125;,&&&&&&&&onComplete: function(transport) &&&&&&&#123;&&&&&&&&&&&&if (!WebApp._noerror_)&&&&&&&&&#123;&&&&&&&&&&&&&&setTimeout(WebApp.WebMain, 5000); &&&&&&&&&#125;else&&&&&&&&&&&&&&&#123; &&&&&&&&&&setTimeout(WebApp.WebMain, 10); &&&&&&&&&#125;&&&&&&&&&&&&WebApp._noerror_ =&&&&&&&&&&&#125;&&&&&#125;);&&&#125;,&&&&handleResponse : function(response)&&&&&#123;&&&&&&$(&#8216;content&#8217;).innerHTML += &#8216;
&#8216; + response[&#8216;msg&#8217;] + &#8216;
&#8216;;&&&&&#125;,&&&&doRequest : function(request)&&&&&#123;&&&&&&new Ajax.Request(WebApp._url_, &&&&&#123;&&&&&&&&&&method&&&& : &#8216;get&#8217;,&&&&&&&&&&parameters&&: &#123; &#8216;msg&#8217; : request &#125;&&&&&&&#125;);&&&&&#125;,&&&&//成员属性&&&&_timestamp_&& : 0,&&_url_&&&&&&&&: &#8216;./comet.php&#8217;,&&&&_noerror_&&&&&&: true&&&#125;[/codesyntax]以下是代码的打包文件:可以将代码上传到服务器上,然后打开两个不同的浏览器。从一方发送数据,可以看到另一方会立即显示出更新。以下是本文的参考资料,想要了解更多的朋友可以前去访问:浅谈comet技术&&Comet:基于 HTTP 长连接的“服务器推”技术&&实战 Comet 应用程序开发 javaeye上的Comet相关文章php如何实现服务器推送技术,即时把信的数据发送到客户端。_百度知道
php如何实现服务器推送技术,即时把信的数据发送到客户端。
不是从客户端主动获取而是从服务器端主动发送到客户端的。
提问者采纳
使用ajax,定时发送请求到服务器
其他类似问题
按默认排序
其他3条回答
需要做长连接,不过长连接要占用连接并发数的,除非自己服务器否则几十个人你的服务器就用不了了
那后台代码要怎么写呢?
从1991年到1997年,他在俄罗斯大型计算机公司“KAMI”的信息技术中心,带领为企业范围内的工作站和网路服务器提供全面的病毒防护-全球唯一病毒码更新的
没错除了长连接,没有可能
服务器推的相关知识
您可能关注的推广回答者:回答者:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁请问tcp 建立连接后,tcp的服务器能主动发数据给客户端而不需要客户端的申请么?
[问题点数:40分,结帖人u]
请问tcp 建立连接后,tcp的服务器能主动发数据给客户端而不需要客户端的申请么?
[问题点数:40分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2011年9月 C/C++大版内专家分月排行榜第二2011年4月 C/C++大版内专家分月排行榜第二2010年11月 C/C++大版内专家分月排行榜第二
2011年6月 C/C++大版内专家分月排行榜第三
2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
2014年1月 扩充话题大版内专家分月排行榜第三2013年12月 扩充话题大版内专家分月排行榜第三2013年4月 C/C++大版内专家分月排行榜第三
2012年 总版技术专家分年内排行榜第七
2014年11月 总版技术专家分月排行榜第二2014年10月 总版技术专家分月排行榜第二2014年6月 总版技术专家分月排行榜第二2014年5月 总版技术专家分月排行榜第二2014年3月 总版技术专家分月排行榜第二2013年5月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。主动FTP和被动FTP_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
3页免费5页免费5页免费2页免费2页免费 2页免费3页免费2页免费2页免费2页免费
喜欢此文档的还喜欢3页免费5页免费9页免费12页1下载券43页免费
主动FTP和被动FTP|处&#8203;理&#8203;防&#8203;火&#8203;墙&#8203;和&#8203;其&#8203;他&#8203;网&#8203;络&#8203;连&#8203;接&#8203;问&#8203;题&#8203;时&#8203;最&#8203;常&#8203;见&#8203;的&#8203;一&#8203;个&#8203;难&#8203;题&#8203;是&#8203;主&#8203;动&#8203;F&#8203;T&#8203;P&#8203;与&#8203;被&#8203;动&#8203;F&#8203;T&#8203;P&#8203;的&#8203;区&#8203;别&#8203;以&#8203;及&#8203;如&#8203;何&#8203;完&#8203;美&#8203;地&#8203;支&#8203;持&#8203;它&#8203;们&#8203;。&#8203;幸&#8203;运&#8203;地&#8203;是&#8203;,&#8203;本&#8203;文&#8203;能&#8203;够&#8203;帮&#8203;助&#8203;你&#8203;清&#8203;除&#8203;在&#8203;防&#8203;火&#8203;墙&#8203;环&#8203;境&#8203;中&#8203;如&#8203;何&#8203;支&#8203;持&#8203;F&#8203;T&#8203;P&#8203;这&#8203;个&#8203;问&#8203;题&#8203;上&#8203;的&#8203;一&#8203;些&#8203;混&#8203;乱&#8203;。
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢本示例以Servlet为例,演示Android与Servlet的通信。 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式。至于Socket通信会在以后的博文中介绍。 HTTP协议简介:& HTTP (Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种协议。&& HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为&#8220;一次连接&#8221;。& 在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。& 在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。& 由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种&#8220;短连接&#8221;、&#8220;无状态&#8221;,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次&#8220;保持连接&#8221;的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端&#8220;在线&#8221;。若服务器长时间无法收到客户端的请求,则认为客户端&#8220;下线&#8221;,若客户端长时间无法收到服务器的回复,则认为网络已经断开。&
基于HTTP1.0协议的客户端在每次向服务器发出请求后,服务器就会向客户端返回响应消息,在确认客户端已经收到响应消息后,服务端就会关闭网络连接。在这个数据传输过程中,并不保存任何历史信息和状态信息,因此,HTTP协议也被认为是无状态的协议。& HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持。当客户端使用HTTP1.1协议连接到服务器后,服务器就将关闭客户端连接的主动权交还给客户端;也就是说,只要不调用Socket类的close方法关闭网络连接,就可以继续向服务器发送HTTP请求。& HTTP连接使用的是&#8220;请求&#8212;响应&#8221;的方式(2次握手),不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。而Socket连接在双方建立起连接后就可以直接进行数据的传输&& HTTP协议的特点:& 支持B/S及C/S模式;
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记;
无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。& HTTP协议请求方法:& 请求行中包括了请求方法,解释如下:
GET 请求获取Request-URI 所标识的资源;
POST 在Request-URI 所标识的资源后附加新的数据;
HEAD 请求获取由Request-URI 所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI 作为其标识
DELETE 请求服务器删除Request-URI 所标识的资源;
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
Get与Post请求区别:& Post请求可以向服务器传送数据,而且数据放在HTML HEADER内一起传送到服务端URL地址,数据对用户不可见。而get是把参数数据队列加到提交的URL中,值和表单内各个字段一一对应,
例如(/s?w=%C4&inputT=2710) get 传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
get安全性非常低,post安全性较高。 项目结构图:& && &&get方式:&& & & & &get机制用的是在URL地址里面通过?号间隔,然后以name=value的形式给客户端传递参数。所以首先要在Android工程下的AndroidGetTest.java中onCreate方法定义好其URL地址以及要传递的参数,然后通过URL打开一个HttpURLConnection链接,此链接可以获得InputStream字节流对象,也是往服务端输出和从服务端返回数据的重要过程,而若服务端response.getInputStream.write()往andorid返回信息时候,就可以通过InputStreamReader作转换,将返回来的数据用BufferReader显示出来。 具体代码如下:&& & & & &Servlet端接收数据并返回通知:&&& & &&Android端发送消息并接收Servlet返回的消息: &
&post方式:&& & & & post传输方式不在URL里传递,也正好解决了get传输量小、容易篡改及不安全等一系列不足。主要是通过对HttpURLConnection的设置,让其支持post传输方式,然后在通过相关属性传递参数(若需要传递中文字符,则可以通过URLEncoder编码,而在获取端采用URLDecoder解码即可)&& &
最后,希望转载的朋友能够尊重作者的劳动成果,加上转载地址:&&谢谢。 完毕。^_^&
阅读(...) 评论()

我要回帖

更多关于 客户端 服务器 模式 的文章

 

随机推荐