因为在做通用通信中间件时,发送统计的过程中,需要对每个正常开启的适配器进行更加明确的状态监控,即此适配器是否正在发送短信,若正在发送就给页面的此适配器替换成充电的动态显示,所我们需要用长连接解决
原文链接:https://www.f2er.com/ajax/164554.html
前言:
在web开发中通常我们把静态网页连接在一起,这种做法会引起浏览器的刷新,并且要等待页面的加载。现在需要能够通过web访问的完全动态的应用,这些应用通常需要尽可可的快,提供近乎实时的组件。下面是使用反向Ajax(reverse Ajax)技术来开发事件驱动的web应用
反向Ajax技术
ajax请求在缺省情况下是无状态的,且只能从客户端向服务器端发出请求,反向ajax的目的是允许服务器端向客户端推送信息,从而绕过上面的限制。
一.HttP轮询 和 Jsonp轮询
轮询(polling)涉及了从客户端向服务器端发出请求以获取一些数据,这显然就是一个纯粹的Ajax HTTP请求。为了尽快地获得服务器端事件,轮询的间隔(两次请求相隔的时间)必须尽可能地小。但有这样的一个缺点存在:如果间隔减小的话,客户端浏览器就会发出更多的请求, 这些请求中的许多都不会返回任何有用的数据,而这将会白白地浪费掉带宽和处理资源。
轮询(polling)涉及了从客户端向服务器端发出请求以获取一些数据,这显然就是一个纯粹的Ajax HTTP请求。为了尽快地获得服务器端事件,轮询的间隔(两次请求相隔的时间)必须尽可能地小。但有这样的一个缺点存在:如果间隔减小的话,客户端浏览器就会发出更多的请求, 这些请求中的许多都不会返回任何有用的数据,而这将会白白地浪费掉带宽和处理资源。
JSONP轮询基本上与HTTP轮询一样,不同之处则是JSONP可以发出跨域请求(不是在你的域内的请求)。
1. 优点:很容易实现,不需要任何服务器端的特定功能,且在所有的浏览器上都能工作。
2. 缺点:这种方法很少被用到,因为它是完全不具伸缩性的。试想一下,在100个客户端每个都发出2秒钟的轮询请求的情况下,所损失的带宽和资源数量,在这种情况下30%的请求没有返回数据。
2. 缺点:这种方法很少被用到,因为它是完全不具伸缩性的。试想一下,在100个客户端每个都发出2秒钟的轮询请求的情况下,所损失的带宽和资源数量,在这种情况下30%的请求没有返回数据。
二.Comet(长轮询)
使用轮询和捎带的反向Ajax非常受限:不具有伸缩性,不提供低延迟通信(只要事件一到达服务器端,它们就以尽可能快的速度到达浏览器端)
comet:是一个web应用模型,请求被发送到服务器端并保持一个很长的存活期,直到超时或者有服务器端事件发生。在该请求完成后,又调用该方法,有一个长生存期ajax请求又去了。使用Comet的话,web服务器就可以在无需显式请求的情况下向客户端发送数据。
Comet的一大优点是,每个客户端始终都有一个向服务器端打开的通信链路。服务器端可以通过在事件到来时立即提交(完成)响应来把事件推给客户端,或者它甚至可以累积再连续发送。因为请求长时间保持打开的状态,故服务器端需要特别的功能来处理所有的这些长生存期请求。
1.使用HTTP流的Comet
iframe:
在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天
1. 优点:实现简单,在所有支持iframe的浏览器上都可用。
2. 缺点: 没有方法可用来实现可靠的错误处理或是跟踪连接的状态,因为所有的连接和数据都是由浏览器通过HTML标签来处理的,因此你 没有办法知道连接何时在哪一端已被断开了。
2. 缺点: 没有方法可用来实现可靠的错误处理或是跟踪连接的状态,因为所有的连接和数据都是由浏览器通过HTML标签来处理的,因此你 没有办法知道连接何时在哪一端已被断开了。
2.使用XMLHttpRequest长轮询(即ajax长轮询)
第二种,也是一种推荐的实现Comet的做法是打开一个到服务器端的Ajax请求然后等待响应。服务器端需要一些特定的功能来允许请求被挂起,只要一有事件发生,服务器端就会在挂起的请求中送回响应并关闭该请求,完全就像是你关闭了servlet响应的输出流。然后客户端就会使用这一响应并打开一个新的到服务器端的长生存期的Ajax请求
servlet端,@WebServlet是Servlet 3.0中的注释,这样就不需要在web.xml中再进行several的配置
1. 优点:客户端很容易实现良好的错误处理系统和超时管理。这一可靠的技术还允许在与服务器端的连接之间有一个往返,即使连接是非持久的(当你的应用有许多的客户端时,这是一件好事)。它可用在所有的浏览器上;你只需要确保所用的XMLHttpRequest对象发送到的简单的Ajax请求就可以了。
2. 缺点:相比于其他技术来说,不存在什么重要的缺点,像所有我们已经讨论过的技术一样,该方法依然依赖于无状态的HTTP连接,其要求服务器端有特殊的功能来临时挂起连接。
综上,我采用了基于ajax长轮询的方式实现comet,
项目代码如下:
js:
servlet:
参考网站:http://kb.cnblogs.com/page/112185/
http://www.cnblogs.com/hoojo/p/longPolling_comet_jquery_iframe_ajax.html