`
aol_aog
  • 浏览: 16854 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Http环境下的保持连接方式

 
阅读更多

Http环境本身是一种无连接状态的架构,在这种架构下服务器只能是被动的接受客户端的请求,返回结果,而无法主动的给客户端发送数据。而在很多需要实时数据交互(比如WebIM)的场景中,我们却希望能及时得到服务器给我们返回的数据。此时,一种最为普遍的做法是:在客户端用定时器,定时去请求服务器的服务,来得到最新数据。而这样一来,很多时候却是在做无用功,频繁的请求也会无端的增加服务器和客户端在请求Web服务上的消耗。那么是否有一种更好的办法,既可以及时得到服务器的返回,同时又可以减少做无用功,以及频繁请求带来的性能问题呢?

记得前不久,在园子里有这样的一篇文章,介绍了几种WEB环境定时刷新数据的机制。其中就有提到googlegmail的一种比较巧妙的做法,现在记不得当时是怎么理解这种做法了,只记得有“保持长连接”的基本做法。(当然现在也找不到这篇文章了,希望了解的朋友能提醒一下)。今天由于架构方案的需要,再来仔细思考连接保持方案,以及参考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服务怎么知道要给客户端发送数据,也就是服务器的轮循设计,则是另一个需要考虑的方案);可以减化客户端逻辑,无需要创建和释放定时器,并减小由此产生的对客户端性能的损失;减少去服务器的请求次数,减少做无用功,节约节省带宽和减少服务器资源需要处理的连接请求。

相信在此之前,已经有很多人在使用这种方案了。欢迎大家就此方案发表自己的见解。

补充:服务器部分的设计,除了使用轮循外,也可以考虑使用资源互斥访问的方式来设计,这样做可以获得更佳性能,更高实时性,具体的方案应当根据实际情况来考虑。

分享到:
评论

相关推荐

    Centos7环境下Nginx版本升级方式及步骤

    此手册主要用于记录个人进行nginx升级的步骤和心得,介绍了2种升级方式。 YUM upgrade升级:本方式适用于使用rpm安装nginx的方式,优点是升级操作简单便捷,缺点是无法升级到指定版本,...下一步,就是保持还有连接

    绘大脑发育图谱,找神经连接规律(发表在Nature期刊)

    为了适应生存,神经连接也在不断改变,比如在生殖期开始有新的连接形成,在学习过程中的神经连接随着外界反馈会不断自我修正,而与躯体运动相关的连接则一直保持强有力的输出等等。这些变化现象背后的规律如何?要...

    unity3d 网络插件 Best HTTP Pro Edition 1.10.unitypackage

    通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,...

    论文研究-动态物联网环境下的联盟学习计算卸载优化.pdf

    智能城市、智慧工厂等对物联网设备(Internet of Things,IoT)的性能和连接性提出了挑战。边缘计算的出现弥补了这些能力受限的设备,通过将密集的计算任务从它们迁移到边缘节点(Edge Node,EN),物联网设备能够在...

    C#之实现Scoket心跳机制

    事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。 总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40...

    Molex新推出针对手机制造商的板对板连接器

    前段时间Molex推出了SlimStack板对板连接器,该款产品即使在强烈振动冲击的情况下任然能保持牢固链接。因其有多种锁定功能相结合,可提供比Molex标准系列(503304/503308系列)强48%的对配保持力。这是根据原有连接...

    oracle连接sqlserver

    oracle通过安装透明网关访问sqlserver数据库,透明网关要与数据库的版本保持一致,附件中包含了透明网关及数据库的配置文件及经过整理测试的文档。亲测好用,但是由于不同的环境导致无法访问的 请检查防火墙及安全...

    跨平台速度快小巧流畅的免费远程桌面连接控制传输工具.rar

    是一款跨平台速度快的免费远程连接/远程桌面控制/远程发送、接受文件软件,据说是前 TeamViewer 开发小组人员自立门户的产品,它拥有先进的视频压缩技术 DeskRT, 可以轻松穿透防火土「qi」啬「ang」/路由器,实测在...

    Winddos环境CwRsync软件下载和配置教程

     可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。  支持匿名传输,以方便进行网站镜象。 提供供大家下载: cwRsync_4.0.5_Installer.zip (客户端)、cwRsyncServer_4.0.5_Installer.zip...

    电子连接器设计基础.pdf

    Tyco Electronics Dongguan PE Department 电子连接器设计基础概论 连接器定义: 电子连接器是一种电子机械的系统,此系统提供一种可分离 的连接方式,在两线 间沒有讯号失真或能 损失的情形 下,进 稳定且长时间的...

    物联网环境下无线传感数据加密传输系统设计

    在固有物联网框架中,确定无线数据传输模块、传感加密模块间的交互连接关系,完成新型系统的硬件运行环境搭建。在此基础上,以定义格式的数据包作为原始信息,编写Java Socket加密代码、选择数据加密传输模板,完成...

    docker_devenv:在任何系统上创建和维护用于开发工作的Docker映像,保持开发环境相同,需要在连接大量git存储库的情况下运行

    docker_devenv 在任何系统上创建和维护用于开发工作的Docker映像,保持开发环境相同,需要在连接大量git存储库的情况下运行构建Docker映像docker build --rm -f dockerfile -t gfish / devenv:1.0。推送到我的帐户...

    7805稳压电源如何12V转5V电路图及接线方式

    稳压电路:在输入电压、负载、环境温度、电路参数等发生变化时仍能保持输出电压恒定的电路。这种电路能提供稳定的直流电源,广为各种电子设备所采用。 稳压电源的分类方法繁多,按输出电源的类型分有直流稳压...

    论文研究-DCAM平台下的分布式方面构件模型及协同框架的研究.pdf

    扩展后的DCAM平台不仅保持了原平台对POJO的支持,同时通过对分布式协同框架的引入,使平台在分布式环境下具有更好的可扩展性和容错性,满足了按需计算的需求。最后通过应用实例对DCAM的分布式模型进行了可行性验证并...

    Xshell-Linux远程登录-免费的服务器连接工具 (永久使用版)

    Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。除...

    mysql允许远程连接的方法

    一、概述  本文主要介绍通过federated... mysql配置远程连接必须在本地创建federated存储引擎的表,配置远程连接参数,本地创建的表必须和远程表的定义保持一致,这里我就拿本地另一个案例数据库来做测试,效果和远

    5G随身WIFI开源项目,SA+NSA网络环境和Sub-6GHz频段WiFi5技术,拥有2.4G5G双频核心完整项目代码

    5G/4G网络可无缝自动快速切换,保持随时随地持久连接。设备采用2X2 WiFi5技术,拥有2.4G/5G双频可选,WiFi信号速率更高,覆盖范围更广,最多支持10个设备同时连接,让手机、平板、笔记本电脑、台式机等均可畅享高速...

    手机WiFi自动切换

    wiFi自动切换(Wifi Jumper)是一款能够自动根据无线信号强度切换网络的WiFi辅助工具,可以在SSID相同的AP环境下,智能切换到信号最强的无线网络,也可以根据无线基站来创建特定环境的连接方式,例如设置了A区域自动...

    基于LPC4300的智能家居检测系统.doc

    智能家居是在互联网影响之下,物联网化的体现。智能家居通过物联网技术将家中的各种设备连接到一起,提供基于PC或智能手机等智能终端的家电控制、防盗报警、...帮助家庭与外部保持信息交流畅通,优化人们的生活方式。

    智能家居市场分析及发展趋势

    家居智能化系统将家庭中各种与信息相关的通信设备、家用电器以及家庭保安装置通过有线或无线的方式连接起来,并进行集中或异地的监控、管理,保持家庭住宅环境的舒适、协调。与普通的家居相比,智能家居不仅具备传统...

Global site tag (gtag.js) - Google Analytics