zoukankan      html  css  js  c++  java
  • Http环境下的保持连接方式

    Http环境本身是一种无连接状态的架构,在这种架构下服务器只能是被动的接受客户端的请求,返回结果,而无法主动的给客户端发送数据。而在很多需要实时数据交互(比如Web IM)的场景中,我们却希望能及时得到服务器给我们返回的数据。此时,一种最为普遍的做法是:在客户端用定时器,定时去请求服务器的服务,来得到最新数据。而这样一来,很多时候却是在做无用功,频繁的请求也会无端的增加服务器和客户端在请求Web服务上的消耗。那么是否有一种更好的办法,既可以及时得到服务器的返回,同时又可以减少做无用功,以及频繁请求带来的性能问题呢? 
       今天由于架构方案的需要,再来仔细思考连接保持方案,以及参考gmail的请求行为,总结了一下,应该是这样的:客户端一直保持一个与服务器的连接,这个连接一直保持着对服务器的请求动作,直到服务器发现有数据后给它返回后,才结束返回这一次请求。客户端在接收到请求返回后,在处理这些返回之前,又向服务器发送了一次连接请求,直到下一次有数据返回。不可避免的有一种情况,就是如果服务器长时间没有需要给客户端发送数据的话,那么可以就会造成请求失败(超时或其它原因)。对于这种情况的处理也是一样的,在错误的回调事件中重新发送一次请求连接。这样就可以模拟保持连接状态了。 
    用伪代码来描述一下思路吧:   
    客户端脚本: 
       1: function Request() 
       2: { 
       3:     Ajax.Request(url,OnSuccessed,OnFailed); 
       4: } 
       5: function OnSuccessed(response) 
       6: { 
       7:     //重新发送一次请求 
       8:     Request(); 
       9:      //处理返回数据 
      10: } 
      11: function OnFailed() 
      12: { 
      13:     //错误(超时)重新请求 
      14:     Request(); 
      15: } 
    Web服务: 
       1: public class IMService : IHttpHandler 
       2: { 
       3:     public bool IsReusable{return false;} 
       4:     public void ProcessRequest(HttpContext context) 
       5:     { 
       6:         //读取最新数据 
       7:         while(true) 
       8:         { 
       9:             string message = GetMessage(); 
      10:             if(!string.IsNullOrEmpty(message)) 
      11:             { 
      12:                 context.Response.Write(message); 
      13:                 break; 
      14:             } 
      15:             Thread.Sleep(500);//等待一段时间再重新读取。 
      16:         } 
      17:     } 
      18:     private string GetMessage() 
      19:     { 
      20:         //取得最新数据 
      21:     } 
      22: } 
    这种方案的好处有:客户端可以第一时间得到服务器需要给客户端发送的数据(而至于Web服务怎么知道要给客户端发送数据,也就是服务器的轮循设计,则是另一个需要考虑的方案);可以减化客户端逻辑,无需要创建和释放定时器,并减小由此产生的对客户端性能的损失;减少去服务器的请求次数,减少做无用功,节约节省带宽和减少服务器资源需要处理的连接请求。 
    相信在此之前,已经有很多人在使用这种方案了。欢迎大家就此方案发表自己的见解。 
    补充:服务器部分的设计,除了使用轮循外,也可以考虑使用资源互斥访问的方式来设计,这样做可以获得更佳性能,更高实时性,具体的方案应当根据实际情况来考虑。
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/ddyq/p/2026301.html
Copyright © 2011-2022 走看看