Board logo

标题: 在 Ajax 应用程序中实现实时数据推送 -2 Ajax 应用程序中的服务器更新技术 [打印本页]

作者: look_w    时间: 2018-8-23 20:38     标题: 在 Ajax 应用程序中实现实时数据推送 -2 Ajax 应用程序中的服务器更新技术

Ajax 应用程序中的服务器更新技术让我们来具体看看用于更新来自服务器的信息的一些常用技术,这些技术模拟了服务器推送。
短轮询短轮询也称为高频轮询,就是我在本文开头处介绍的技术。这种方法在以下情况中表现最好:
长轮询长轮询是用于更新服务器数据的另外一种方法。这种方法的理念就是客户端建立连接,服务器阻塞连接(通过使请求线程在某些条件下处于等待状态),有数据可用时,服务器将通过阻塞的连接发送数据,随后关闭连接。客户端在接收到更新后,立即重新建立连接,服务器重复上述过程,以此实现近于实时的通信。然而,长轮询具有以下缺陷:
流通道流通道(streaming channel)与长轮询大致相同,差别在于服务器不会关闭响应流。而是特意保持其处于打开状态,使浏览器认为还有更多数据即将到来。但是,流通道也有着自己的缺陷:
通常,第一个问题可通过为每个流响应附加垃圾有效载荷来解决,使响应数据足以填满缓冲区。第二个问题可通过 “保持活动” 或按固定间隔 “同步” 消息来欺瞒浏览器,使浏览器认为数据是以较慢的速率传入的。
这些解决方案适用的用例范围狭窄。所有这些方法都已经在 Internet 上的某些解决方案中得到了应用。然而,这些解决方案都遭遇了相同的问题:缺乏可伸缩性。典型情况下,要阻塞一个请求,您需要阻塞处理请求的线程,因为如今几乎所有应用服务器都会执行阻塞 I/O。即便不是这样,Java™ 2 Platform, Enterprise Edition (J2EE) 也未提供为 HTTP 请求和响应执行非阻塞 I/O 的标准。(Servlets 3.0 API 可解决这一问题,因为这些 API 中包含 Comet Servlet。)
至此,您需要具备非阻塞 I/O(NIO)服务器,客户端应用程序通过它进行连接。由于此类套接字是纯 TCP 二进制套接字,因而将实现以下目标:
基于上述说明,有必要指出这种方法的四个缺点:
在这篇文章中,我要强调的是如何真正地绕开第三个和第四个问题。如果您能够处理安全性和防火墙问题,那么其他问题也能得到处理。这种做法的获益极为显著。
您可为应用程序实现最大程度的实时服务器推送行为(不考虑网络延时等外部因素),您将获得高度可伸缩的解决方案(以同时连接的客户端数量为准)。
下面我们将开始探索如何解决上述的第三个和第四个问题。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0